はじめに
Snowflakeで変数を扱うときに
- $変数名
と書いてるのと - IDENTIFIER($変数名)
と書いてるのの2種類あって、
なんで2パターンあるの?
使い分けは?
と疑問に思ったので調べました。
公式ドキュメント
$変数名
公式ドキュメントにあったものをちょっといじってやってみます。
--変数セット
SET my_variable1=10;
SET my_variable2='example';
--変数の値をselect
select $my_variable1;
--$MY_VARIABLE1
--10
select $my_variable2;
--$MY_VARIABLE2
--example
こんな具合に、変数値としてセットしたものを$変数名でSELECTできました。
単純なSELECTだと面白くないのでINSERTも見てみます。
--事前準備START
create database test_db;
create schema test_schema;
create table test_table (id number,name varchar);
insert into test_table (id,name) values (1,'a');
insert into test_table (id,name) values (2,'b');
--事前準備END
作ったテーブルに対して、変数を使ってもう1件、INSERTしてみます。
SET insert_id=3;
SET insert_name='c';
insert into test_table (id,name) values ($insert_id,$insert_name);
select * from test_table;
--ID NAME
--1 a
--2 b
--3 c
変数でセットした値を使ってINSERTできました。
次はテーブル名の方を変数にしてみます。
SET table_name='test_table';
select * from $table_name;
--SQLコンパイルエラー:
--位置 14 の構文エラー行 1 、予期しない「$table_name」。
テーブル名だと$変数名が使えないようです。
IDENTIFIER($変数名)
そこで登場するのがIDENTIFIER($変数名)。
SET table_name='test_table';
select * from IDENTIFIER($table_name);
--ID NAME
--1 a
--2 b
--3 c
エラーにならずに取得できました。
まとめ
テーブル名とかカラム名とか、SnowflakeのオブジェクトにあたるものはIDENTIFIER($変数名)でないとうまく取れませんよ。ということだと理解しました。
間違ってたらご指摘ください。
なお、下記の投稿ではIDENTIFIERを書きまくってますが、その辺全然わかってなくて適当に書いてました。