資料表函式

資料表函式 (也稱為資料表值函式 (TVF)) 是使用者定義的函式,會傳回資料表。您可以在任何可使用資料表的地方使用資料表函式。資料表函式的行為與檢視類似,但資料表函式可以採用參數。

建立資料表函式

如要建立資料表函式,請使用 CREATE TABLE FUNCTION 陳述式。資料表函式包含產生資料表的查詢。函式會傳回查詢結果。下列資料表函式會採用 INT64 參數,並在名為 bigquery-public-data.usa_names.usa_1910_current公開資料集查詢中,使用 WHERE 子句內的值:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
AS (
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE year = y
  GROUP BY year, name
);

如要以其他方式篩選,可以將多個參數傳遞至表格函式。 下列資料表函式會依年份和名稱前置字元篩選資料:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year_and_prefix(
  y INT64, z STRING)
AS (
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE
    year = y
    AND STARTS_WITH(name, z)
  GROUP BY year, name
);

表格參數

您可以將 TVF 參數設為資料表。在資料表參數名稱後方,您必須明確指定必要的資料表結構定義,指定方式與結構體的欄位相同。傳遞至 TVF 的表格引數可包含參數結構定義中指定的資料欄以外的資料欄,且資料欄可依任意順序顯示。

下列資料表函式會傳回包含 item_name 資料表總銷售額的資料表 (來自 orders 資料表):

CREATE TABLE FUNCTION mydataset.compute_sales (
  orders TABLE<sales INT64, item STRING>, item_name STRING)
AS (
  SELECT SUM(sales) AS total_sales, item
  FROM orders
  WHERE item = item_name
  GROUP BY item
);

參數名稱

如果資料表函式參數與資料表資料欄的名稱相符,可能會建立不明確的參照。在這種情況下,BigQuery 會將名稱解讀為資料表欄的參照,而非參數。建議您使用與任何參照資料表欄名稱不同的參數名稱。

使用資料表函式

您可以在任何資料表有效的環境中呼叫資料表函式。下列範例會在 SELECT 陳述式的 FROM 子句中呼叫 mydataset.names_by_year 函式:

SELECT * FROM mydataset.names_by_year(1950)
  ORDER BY total DESC
  LIMIT 5

結果如下所示:

+------+--------+-------+
| year |  name  | total |
+------+--------+-------+
| 1950 | James  | 86447 |
| 1950 | Robert | 83717 |
| 1950 | Linda  | 80498 |
| 1950 | John   | 79561 |
| 1950 | Mary   | 65546 |
+------+--------+-------+

您可以將資料表函式的輸出內容與另一個資料表彙整:

SELECT *
  FROM `bigquery-public-data.samples.shakespeare` AS s
  JOIN mydataset.names_by_year(1950) AS n
  ON n.name = s.word

您也可以在子查詢中使用表格函式:

SELECT ARRAY(
  SELECT name FROM mydataset.names_by_year(1950)
  ORDER BY total DESC
  LIMIT 5)

呼叫含有資料表參數的資料表函式時,您必須在資料表引數名稱前使用 TABLE 關鍵字。資料表引數可以包含資料表參數結構定義中未列出的資料欄:

CREATE TABLE FUNCTION mydataset.compute_sales (
  orders TABLE<sales INT64, item STRING>, item_name STRING)
AS (
  SELECT SUM(sales) AS total_sales, item
  FROM orders
  WHERE item = item_name
  GROUP BY item
);

WITH my_orders AS (
    SELECT 1 AS sales, "apple" AS item, 0.99 AS price
    UNION ALL
    SELECT 2, "banana", 0.49
    UNION ALL
    SELECT 5, "apple", 0.99)
SELECT *
FROM mydataset.compute_sales(TABLE my_orders, "apple");

/*-------------+-------+
 | total_sales | item  |
 +-------------+-------+
 | 6           | apple |
 +-------------+-------*/

列出資料表函式

資料表函式是一種常式,如要列出資料集中的所有常式,請參閱「列出常式」。

刪除資料表函式

如要刪除資料表函式,請使用 DROP TABLE FUNCTION 陳述式:

DROP TABLE FUNCTION mydataset.names_by_year

授權處理常式

您可以將資料表函式授權為常式。授權常式可讓您與特定使用者或群組分享查詢結果,而不必授予他們產生結果的基礎資料表存取權。舉例來說,授權常式可以計算資料的匯總值,或查閱資料表值並用於計算。詳情請參閱「已授權的日常安排」。

限制

  • 查詢主體必須是 SELECT 陳述式,且不得修改任何內容。舉例來說,資料定義語言 (DDL) 和資料操縱語言 (DML) 陳述式不允許用於資料表函式。如果需要副作用,建議改為編寫程序

  • 資料表函式必須與參照的資料表儲存在相同位置。

配額

如要進一步瞭解資料表函式配額和限制,請參閱配額和限制