識別子としてのリテラルと変数¶
Snowflake SQL ステートメントでは、オブジェクトを名前で参照することに加えて(識別子の要件 を参照)、文字列リテラル、セッション変数、バインド変数、または Snowflakeスクリプト変数 を使用しても、オブジェクトを参照できます。たとえば、 SELECT ステートメントの FROM 句でテーブルの名前に設定されているセッション変数を使用できます。
リテラルまたは変数で指定されたオブジェクト名を使用するには、 IDENTIFIER() を使用します。
構文¶
IDENTIFIER( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } )
string_literal
オブジェクトの名前を識別する文字列です。
文字列は、一重引用符(
'name'
)で囲むか、ドル記号($name
)で始まる必要があります。文字列リテラルには、完全修飾オブジェクト名(
'db_name.schema_name.object_name'
または$db_name.schema_name.object_name
など)を使用できます。
session_variable
セッションに設定された SQL 変数 です。
bind_variable
?
または:variable
の形式の バインド変数 です。バインドをサポートするクライアント/プログラムインターフェイス(JDBC 、 ODBC、Pythonなど)で使用できます。snowflake_scripting_variable
設定された Snowflakeスクリプト変数。
使用上の注意¶
オブジェクトを名前(クエリ、 DML、 DDL など)で識別する必要があるときには、リテラルと変数(セッションまたはバインド)を使用できる場合があります。
同じクエリで、オブジェクト識別子にバインド変数を使用し、値にバインド変数を使用できます。
FROM
句では、TABLE( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } )
をIDENTIFIER( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } )
の同義語として使用できます。IDENTIFIER(...)
は関数の構文を使用しますが、これは真の関数ではなく、SHOW FUNCTIONS
などのコマンドによって返されません。
例¶
文字列リテラル:
create or replace database identifier('my_db'); +--------------------------------------+ | status | +--------------------------------------+ | Database MY_DB successfully created. | +--------------------------------------+ create or replace schema identifier('my_schema'); +----------------------------------------+ | status | +----------------------------------------+ | Schema MY_SCHEMA successfully created. | +----------------------------------------+ -- case-insensitive table name specified in a string containing the fully-qualified name create or replace table identifier('my_db.my_schema.my_table') (c1 number); +--------------------------------------+ | status | +--------------------------------------+ | Table MY_TABLE successfully created. | +--------------------------------------+ -- case-sensitive table name specified in a double-quoted string create or replace table identifier('"my_table"') (c1 number); +--------------------------------------+ | status | +--------------------------------------+ | Table my_table successfully created. | +--------------------------------------+ show tables in schema identifier('my_schema'); +---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+ | created_on | name | database_name | schema_name | kind | comment | cluster_by | rows | bytes | owner | retention_time | +---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+ | Tue, 05 Dec 2017 12:16:18 -0800 | MY_TABLE | MY_DB | MY_SCHEMA | TABLE | | | 0 | 0 | SYSADMIN | 1 | | Tue, 05 Dec 2017 12:16:59 -0800 | my_table | MY_DB | MY_SCHEMA | TABLE | | | 0 | 0 | SYSADMIN | 1 | +---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+
セッション変数:
これは、テーブル名またはスキーマ名を持つセッション変数の使用方法を示しています。
set schema_name = 'my_db.my_schema'; set table_name = 'my_table'; use schema identifier($schema_name); insert into identifier($table_name) values (1), (2), (3); select * from identifier($table_name) order by 1; +----+ | C1 | +----+ | 1 | | 2 | | 3 | +----+これは、関数名を持つセッション変数の使用方法を示しています。関数の名前は
speed_of_light
です。CREATE FUNCTION speed_of_light() RETURNS INTEGER AS $$ 299792458 $$;名前で関数を呼び出します。
SELECT SPEED_OF_LIGHT(); +------------------+ | SPEED_OF_LIGHT() | |------------------| | 299792458 | +------------------+IDENTIFIER()構文を使用して関数を呼び出します。
SET MY_FUNCTION_NAME = 'speed_of_light';SELECT IDENTIFIER($MY_FUNCTION_NAME)(); +---------------------------------+ | IDENTIFIER($MY_FUNCTION_NAME)() | |---------------------------------| | 299792458 | +---------------------------------+
バインド変数:
この例は、 JDBC で関数名をバインドする方法を示しています。関数の名前は
speed_of_light
です。String sql_command; // Create a Statement object to use later. System.out.println("Create JDBC statement."); Statement statement = connection.createStatement(); System.out.println("Create function."); sql_command = "CREATE FUNCTION speed_of_light() RETURNS INTEGER AS $$ 299792458 $$"; statement.execute(sql_command); System.out.println("Create prepared statement."); sql_command = "SELECT IDENTIFIER(?)()"; PreparedStatement ps = connection.prepareStatement(sql_command); // Bind ps.setString(1, "speed_of_light"); ResultSet rs = ps.executeQuery(); if (rs.next()) { System.out.println("Speed of light (m/s) = " + rs.getInt(1)); }次の例は、バインディングを使用できるさまざまな SQL ステートメントと、バインドできるさまざまなデータベースオブジェクト(スキーマ名やテーブル名を含む)を示しています。
use schema identifier(?); create or replace table identifier(?) (c1 number); insert into identifier(?) values (?), (?), (?); select t2.c1 from identifier(?) as t1, identifier(?) as t2 where t1.c1 = t2.c1 and t1.c1 > (?); drop table identifier(?);
Snowflakeスクリプト変数:
次の例は、 SELECT ステートメントのテーブル名にSnowflakeスクリプト変数を使用する方法を示しています。
BEGIN LET res RESULTSET := (SELECT COUNT(*) AS COUNT FROM IDENTIFIER(:table_name)); ...