テーブル関数
テーブル関数(テーブル値関数、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 );
パラメータ名
テーブル関数パラメータがテーブル列の名前と一致していると、曖昧な参照が作成される場合があります。この場合、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)
テーブル関数を一覧表示する
テーブル関数はルーティンの一種です。データセット内のすべてのルーティンを一覧表示するには、ルーティンを一覧表示をご覧ください。
テーブル関数を削除する
テーブル関数を削除するには、DROP TABLE FUNCTION
ステートメントを使用します。
DROP TABLE FUNCTION mydataset.names_by_year
ルーティンを承認する
テーブル関数は、ルーティンとして承認できます。承認済みのルーティンを使用すると、結果を生成した基盤となるテーブルへのアクセス権を特定のユーザーまたはグループに付与せずに、そのユーザーまたはグループとクエリ結果を共有できます。たとえば、承認済みのルーティンを使用してデータ集計を実行し、またテーブル値を検索してその値を計算で使用できます。詳しくは、承認済みのルーティンをご覧ください。
制限事項
パラメータはスカラー値でなければなりません。BigQuery のテーブル関数は、入力パラメータとしてテーブルを使用できません。
クエリ本文は
SELECT
ステートメントにする必要があり、何も変更できません。たとえば、テーブル関数ではデータ定義言語(DDL)ステートメントとデータ操作言語(DML)のステートメントを使用できません。副作用が必要な場合は、代わりにプロシージャの作成を検討してください。テーブル関数は、参照するテーブルと同じ場所に保存する必要があります。
割り当て
テーブル関数の割り当てと上限の詳細については、割り当てと上限をご覧ください。