展開演算子

展開演算子は、リストを表すクエリ式をリスト内の個々の値に展開します。現在、Snowflakeでサポートされている展開演算子はスプレッド演算子(**)のみです。

スプレッド

スプレッド演算子は 配列 を個々の値のリストに展開します。この演算子は、以下のような場合に便利です。

これらのユースケースの詳細については、 Snowflake SQL スプレッド演算子(**)の紹介 ブログ投稿をご参照ください。

構文

** <array> 
Copy

制限事項

  • 入力は定数値の配列でなければならず、リテラル値の配列でも、リテラル値の配列を表すバインド変数でも可能です。

  • 半構造化配列の各値は VARIANT 型です。VARIANT には、他のデータ型の値を含めることができます。スプレッド演算子は、 VARIANT に格納される値に対して以下のデータ型をサポートしています。

  • SQL 以外の言語で書かれたユーザー定義関数やストアドプロシージャでは、スプレッド演算子は使用できません。

  • 非常に大きな配列をスプレッド演算子で展開すると、パフォーマンスが低下する可能性があります。

いくつかの例では、以下のテーブルのデータを使用します。

テーブルを作成してデータを挿入します。

CREATE OR REPLACE TABLE spread_demo (col1 INT, col2 VARCHAR); INSERT INTO spread_demo VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'); SELECT * FROM spread_demo; 
Copy
+------+------+ | COL1 | COL2 | |------+------| | 1 | a | | 2 | b | | 3 | c | | 4 | d | | 5 | e | +------+------+ 

以下の例では、スプレッド演算子を使用しています。

IN 句のリテラル値の配列を展開する

先に作成した spread_demo テーブルのクエリで、スプレッド演算子を使用して数値の配列を展開します。

SELECT * FROM spread_demo WHERE col1 IN (** [3, 4]) ORDER BY col1; 
Copy
+------+------+ | COL1 | COL2 | |------+------| | 3 | c | | 4 | d | +------+------+ 

文字列の配列をスプレッド演算子で展開します。

SELECT * FROM spread_demo WHERE col2 IN (** ['b', 'd']) ORDER BY col1; 
Copy
+------+------+ | COL1 | COL2 | |------+------| | 2 | b | | 4 | d | +------+------+ 

INTEGER 値と展開された配列値が混在するクエリでは、 IN 句を使用します。

SELECT * FROM spread_demo WHERE col1 IN (** [1, 2], 4, 5) ORDER BY col1; 
Copy
+------+------+ | COL1 | COL2 | |------+------| | 1 | a | | 2 | b | | 4 | d | | 5 | e | +------+------+ 

システム定義の関数呼び出しでリテラル値の配列を展開する

COALESCE 関数の呼び出しで文字列の配列を展開します。

SELECT COALESCE(** [NULL, NULL, 'my_string_1', 'my_string_2']) AS first_non_null; 
Copy
+----------------+ | FIRST_NON_NULL | |----------------| | my_string_1 | +----------------+ 

GREATEST 関数の呼び出しで数値の配列を展開します。

SELECT GREATEST(** [1, 2, 5, 4, 5]) AS greatest_value; 
Copy
+----------------+ | GREATEST_VALUE | |----------------| | 5 | +----------------+ 

SQL ユーザー定義関数のバインド変数でスプレッド演算子を使用する

スプレッド演算子を使用する SQL ユーザー定義関数を作成します。この関数は引数として配列を受け取り、その配列の値を展開して、以前に作成した spread_demo テーブルをクエリします。

CREATE OR REPLACE FUNCTION spread_function_demo(col_1_values ARRAY) RETURNS TABLE( col1 INT, col2 VARCHAR) AS $$ SELECT * FROM spread_demo WHERE col1 IN (** col_1_values) ORDER BY col1 $$; 
Copy

関数を使用してテーブルをクエリします。

SELECT * FROM TABLE(spread_function_demo([1, 3, 5])); 
Copy
+------+------+ | COL1 | COL2 | |------+------| | 1 | a | | 3 | c | | 5 | e | +------+------+ 

Snowflake Scriptingストアドプロシージャでスプレッド演算子とバインド変数を使用する

スプレッド演算子を使用するSnowflake Scriptingストアドプロシージャを作成します。このストアドプロシージャは引数として配列を受け取り、その配列の値をバインド変数に展開して、先に作成した spread_demo テーブルをクエリします。

CREATE OR REPLACE PROCEDURE spread_sp_demo(col_1_values ARRAY) RETURNS TABLE( col1 INT, col2 VARCHAR) LANGUAGE SQL AS $$ DECLARE res RESULTSET; BEGIN res := (SELECT * FROM spread_demo WHERE col1 IN (** :col_1_values) ORDER BY col1); RETURN TABLE(res); END; $$; 
Copy

ストアドプロシージャを呼び出します。

CALL spread_sp_demo([2, 4]); 
Copy
+------+------+ | COL1 | COL2 | |------+------| | 2 | b | | 4 | d | +------+------+