小ネタです。
スプレッド演算子とは?
スプレッド演算子(Spread operator)は2025/3/15のリリースで実装されました。
「配列を個別の値リストに展開可能」とのことです。
配列とスプレッド演算子の使い方
試してみましょう。
Snowflakeでは配列は以下のような構文になります。
SELECT [1, 2, 3] AS ARR;
スプレッド演算子は以下のような構文で適用します。
SELECT ** [1, 2, 3] AS ARR;
なお、ARRAY_CONSTRUCT
関数を使っても[]
で書いたのと同じ挙動だそうです。ふむふむ。
SELECT ** ARRAY_CONSTRUCT(1, 2, 3) AS ARR;
空の配列を渡すと…クラッシュします。さらばSnowsight。
実行したときのワークシートが(おそらくキャッシュが残っている間はずっと)開けなくなるので絶対に実行してはいけない。
-- これは実行してはいけない
SELECT ** [];
半構造化データの処理に便利そうなので、ちょっとそういうテーブルを作成して試してみましょう。
-- 準備する
CREATE OR REPLACE TEMPORARY TABLE array_example (id INT, array_column ARRAY);
INSERT INTO array_example (id, array_column)SELECT 1, [1, 2, 3];
INSERT INTO array_example (id, array_column)SELECT 2, [4, 5, 6];
INSERT INTO array_example (id, array_column)SELECT 3, [7, 8, 9];
SELECT * FROM array_example;
-- スプレッド演算子を適用!
SELECT id, ** array_column FROM array_example;
ナムサン!無慈悲な非対応なのだ!
「非定数な配列へのスプレッド演算子は非対応です」みたいなメッセージが出ていますね。
000002 (0A000): Unsupported feature 'spread argument with non-constant array input'.
例えば以下のような「頑張ってコンパイルしたら定数って分かる可能性あるんじゃない?」みたいなSQL文でもNGでした。
-- 動かない!
SELECT ** ARR FROM (
SELECT [1, 2, 3] AS ARR
);
ということで、最初に示したような[]
を直接展開するケースを対象にしているようです。
おそらく、以下のような書き方を省力化できるものを意図しているんじゃないかなーと想像しています。
SELECT
ARR[0] AS A1,
ARR[1] AS A2,
ARR[2] AS A3
FROM (
SELECT [1, 2, 3] AS ARR
);
スプレッド演算子の用途
想像だけで書いているのですが…例えばパラメータを配列としてサッと書いて、そこから展開したいときに便利かもしれません。
プログラムでSQL文を生成するときにも楽できるシーンがあるかも。
ぜひ「こんな使い方もできるよ!」というアイディアを教えてください!
こいつ…ILIKE
とも組み合わせられるぞ!
SELECT * ILIKE 'ARR%2%' FROM (
SELECT ** [1, 2, 3] AS ARR
);