テーブル関数¶
テーブル関数は、入力行ごとに行のセットを返します。返されるセットには、0行、1行、またはそれ以上の行を含めることができます。各行には、1つ以上の列を含めることができます。
テーブル関数は、「表形式関数」と呼ばれることがあります。
このトピックの内容:
テーブル関数とは¶
テーブル関数は通常、関数が個々の入力ごとに複数の行を返す場合に使用されます。
テーブル関数が呼び出されるたびに、異なる数の行を返すことができます。たとえば、指定された日付の記録的な高温のリストを返す関数 record_high_temperatures_for_date() は、4月10日に0行、6月10日に1行、そして8月20日に40行を返す場合があります。
テーブル関数の簡単な例¶
次は、テーブル関数として適切です。
アカウント番号と日付を受け取り、その日にそのアカウントに請求されたすべての料金を返す関数。(特定の日に複数の料金が請求されている可能性があります。)
ユーザー ID を受け入れ、そのユーザーに割り当てられたデータベースロールを返す関数。(ユーザーには、「sysadmin」や「useradmin」などの複数のロールがある場合があります。)
各出力行が複数の入力行に依存する関数¶
テーブル関数は、各出力行に影響を与える入力行の数に基づいて、2つのカテゴリにグループ化できます。
1-to-N
M-to-N
前述の関数は1-to-Nのテーブル関数です。各出力行は1つの入力行のみに依存します。たとえば、関数 record_high_temperatures_for_date() は、複数の出力行を生成する場合があります(その日に記録にヒットした都市ごとに1つ)。特定の入力日付の各出力行は、その日付のみに依存します。各出力行は、1日おきの行から独立しています。
Snowflakeは、M-to-Nのテーブル関数もサポートしています。各出力行は複数の入力行に依存できます。たとえば、関数が株価の移動平均を生成する場合、その関数は複数の入力行(複数の日付)からの株価を使用して各出力行を生成します。
一般的に、M-to-N の関数では、M個の入力行のグループがN個の出力行のグループを生成します。Mは1つ以上の行にすることができます。Nは0行、1行、またはそれ以上の行にすることができます。
たとえば、10日移動平均では、Mは10です。入力10行ずつの各グループが1つの平均価格を生成するため、Nは1です。
組み込みのテーブル関数とユーザー定義のテーブル関数¶
Snowflakeには何百もの組み込み関数があり、その多くはテーブル関数です。組み込みのテーブル関数は システム定義のテーブル関数 にリストされています。
ユーザーは、ユーザー定義の関数または「UDFs」と呼ばれる独自の関数を記述することもできます。一部の UDFs はスカラーです。いくつかは表形式です。ユーザー定義のテーブル関数は「UDTFs」と呼ばれます。UDFs (UDTFs を含む)については、 ユーザー定義関数の概要 をご参照ください。
組み込みのテーブル関数とユーザー定義のテーブル関数は、通常、同じルールに従います。たとえば、 SQL ステートメントから同じように呼び出されます。
テーブル関数の使用¶
FROM 句でのテーブル関数の使用¶
テーブルには行のセットが含まれています。同様に、テーブル関数は行のセットを返します。テーブルとテーブル関数の両方が、行のセットを期待するコンテキストで使用されます。具体的には、テーブル関数は SQL ステートメントの FROM 句で使用されます。
SQL コンパイラがテーブル関数を行のソースとして認識できるようにするために、Snowflakeではテーブル関数の呼び出しを TABLE() キーワードでラップする必要があります。
たとえば、次のステートメントは、引数として DATE 値をとる record_high_temperatures_for_date() という名前のテーブル関数を呼び出します。
SELECT city_name, temperature FROM TABLE(record_high_temperatures_for_date('2021-06-27'::DATE)) ORDER BY city_name;
TABLE() の構文の詳細については、 テーブルリテラル をご参照ください。
一般的な関数と同様に、テーブル関数は、各呼び出しで0、1つ、または複数の入力引数を受け入れることができます。各引数はスカラー式である必要があります。
テーブル関数呼び出しの構文の詳細については、 構文 (このトピック内)をご参照ください。
テーブル関数への入力としてテーブルを使用¶
テーブル関数の引数は、リテラルまたはテーブルの列などの式にすることができます。たとえば、以下の SELECT ステートメントは、テーブルからの値を引数としてテーブル関数に渡します。
CREATE OR REPLACE table dates_of_interest (event_date DATE); INSERT INTO dates_of_interest (event_date) VALUES ('2021-06-21'::DATE), ('2022-06-21'::DATE); CREATE OR REPLACE FUNCTION record_high_temperatures_for_date(d DATE) RETURNS TABLE (event_date DATE, city VARCHAR, temperature NUMBER) as $$ SELECT d, 'New York', 65.0 UNION ALL SELECT d, 'Los Angeles', 69.0 $$; SELECT doi.event_date as "Date", record_temperatures.city, record_temperatures.temperature FROM dates_of_interest AS doi, TABLE(record_high_temperatures_for_date(doi.event_date)) AS record_temperatures ORDER BY doi.event_date, city; +------------+-------------+-------------+ | Date | CITY | TEMPERATURE | |------------+-------------+-------------| | 2021-06-21 | Los Angeles | 69 | | 2021-06-21 | New York | 65 | | 2022-06-21 | Los Angeles | 69 | | 2022-06-21 | New York | 65 | +------------+-------------+-------------+ テーブル関数の引数は、ビューや他のテーブル関数など、他のテーブルのようなソースから取得できます。
システム定義のテーブル関数のリスト¶
Snowflakeは、次のシステム定義(つまり、組み込み)のテーブル関数を提供します。
サブカテゴリ | 関数 | 注意 |
|---|---|---|
データのロード | 詳細については、 Snowflakeにデータをロード をご参照ください。 | |
データ生成 | ||
データ変換 | ||
差分プライバシー | ||
オブジェクトモデリング | ||
パラメーター化されたクエリ | ||
半構造化クエリ | 詳細については、 半構造化データのクエリ をご参照ください。 | |
クエリ結果 | 別の SQL 操作からの出力に対して SQL 操作を実行するために使用できます(例: SHOW) | |
クエリプロファイル | ||
履歴と使用情報 | 次を含みます。 | |
ユーザーログイン | ||
クエリ | ||
詳細については、 Query Acceleration Serviceの使用(QAS) をご参照ください。 | ||
ウェアハウスとストレージの使用 | ||
列レベルと行レベルのセキュリティ | ||
オブジェクトのタグ付け | Information Schemaテーブル関数。 | |
Information Schemaテーブル関数。 | ||
Account Usageテーブル関数。 | ||
アカウント複製 | 詳細については、 複数のアカウント間にわたる複製とフェールオーバーの概要 をご参照ください | |
REPLICATION_GROUP_REFRESH_HISTORY, REPLICATION_GROUP_REFRESH_HISTORY_ALL | ||
アラート | 詳細については、 Snowflakeのデータに基づくアラートの設定 をご参照ください。 | |
バインド変数 | 詳細については、 バインド変数の値を取得する をご参照ください。 | |
データベースの複製 | 詳細については、 複数のアカウント間でのデータベースの複製 をご参照ください。 | |
DATABASE_REFRESH_PROGRESS , DATABASE_REFRESH_PROGRESS_BY_JOB | ||
データのロードおよび転送 | ||
データクラスタリング(テーブル内) | 詳細については、 自動クラスタリング をご参照ください。 | |
動的テーブル | 詳細については、 動的テーブルを作成する をご参照ください。 | |
外部関数 | 詳細については、 外部関数の記述 をご参照ください。 | |
外部テーブル | 詳細については、 外部テーブルの概要 をご参照ください。 | |
Icebergテーブル | Information Schemaテーブル関数。 | |
Information Schemaテーブル関数。 | ||
リスト | ||
マテリアライズドビューのメンテナンス | 詳細については、 マテリアライズドビューの使用 をご参照ください。 | |
通知 | 詳細については、 SYSTEM$SEND_EMAILを使ってメール通知を送信する をご参照ください。 | |
SCIM のメンテナンス | 詳細については、 SCIMAPIリクエストの監査 をご参照ください | |
検索最適化のメンテナンス | 詳細については、 検索最適化サービス をご参照ください。 | |
ストリーム | 詳細については、 ストリームの紹介 をご参照ください。 | |
タスク | 詳細については、 タスクの紹介 をご参照ください。 | |
ネットワークルール | Information Schemaテーブル関数。詳細については、 ネットワークルール をご参照ください。 | |
データの品質 | ||
データ系統 | 詳細については、 データ系統 をご参照ください。 | |
Cortex Search | 詳細については、 Cortex Search をご参照ください。 | |
連絡先 | ||
Snowpark Container Services | 詳細については、 Snowpark Container Services:Monitoring Services をご参照ください。 | |
Snowflake Native Apps | 詳細については、 アプリ仕様の概要 をご参照ください。 |
構文¶
SELECT ... FROM [ <input_table> [ [AS] <alias_1> ] , [ LATERAL ] ] TABLE( <table_function>( [ <arg_1> [, ... ] ] ) ) [ [ AS ] <alias_2> ]; 関数固有の構文については、個々のシステム定義のテーブル関数のドキュメントをご参照ください。