テーブル関数

テーブル関数(テーブル値関数、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

パラメータ名

テーブル関数パラメータがテーブル列の名前と一致していると、曖昧な参照が作成される場合があります。この場合、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)のステートメントを使用できません。副作用が必要な場合は、代わりにプロシージャの作成を検討してください。

割り当て

テーブル関数の割り当てと上限の詳細については、割り当てと上限をご覧ください。