3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

謎のスプレッド演算子!Snowflakeに突如実装された ** とは!?

Posted at

小ネタです。

スプレッド演算子とは?

スプレッド演算子(Spread operator)は2025/3/15のリリースで実装されました。
「配列を個別の値リストに展開可能」とのことです。

配列とスプレッド演算子の使い方

試してみましょう。
Snowflakeでは配列は以下のような構文になります。

SELECT [1, 2, 3] AS ARR;

image.png

スプレッド演算子は以下のような構文で適用します。

SELECT ** [1, 2, 3] AS ARR;

image.png

なお、ARRAY_CONSTRUCT関数を使っても[]で書いたのと同じ挙動だそうです。ふむふむ。

SELECT ** ARRAY_CONSTRUCT(1, 2, 3) AS ARR;

image.png

空の配列を渡すと…クラッシュします。さらばSnowsight。
実行したときのワークシートが(おそらくキャッシュが残っている間はずっと)開けなくなるので絶対に実行してはいけない。

-- これは実行してはいけない
SELECT ** [];

image.png

半構造化データの処理に便利そうなので、ちょっとそういうテーブルを作成して試してみましょう。

-- 準備する
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'.

image.png

例えば以下のような「頑張ってコンパイルしたら定数って分かる可能性あるんじゃない?」みたいな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
);

image.png

スプレッド演算子の用途

想像だけで書いているのですが…例えばパラメータを配列としてサッと書いて、そこから展開したいときに便利かもしれません。
プログラムでSQL文を生成するときにも楽できるシーンがあるかも。
ぜひ「こんな使い方もできるよ!」というアイディアを教えてください!

こいつ…ILIKEとも組み合わせられるぞ!

SELECT * ILIKE 'ARR%2%' FROM (
  SELECT ** [1, 2, 3] AS ARR
);

image.png

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?