文字列リテラル/セッション変数/識別子としてのバインド変数

Snowflakeでは、名前( 識別子の要件 で詳述)によるオブジェクトの識別に加えて、 IDENTIFIER キーワードを使用して、文字列リテラル、セッション変数、またはバインド変数で識別子を指定することもできます。

構文

IDENTIFIER( { string_literal | session_variable | bind_variable } )
文字列リテラル

オブジェクトの名前を識別する文字列です。

  • 文字列は、一重引用符('名前')で囲むか、ドル記号($名前)で始まる必要があります。

  • 文字列リテラルには、完全修飾オブジェクト名( 'データベース名.スキーマ名.オブジェクト名' または $データベース名.スキーマ名.オブジェクト名 など)を使用できます。

セッション変数

セッションに設定された SQL 変数 です。

バインド変数

? または :変数 の形式のバインド変数です。バインドをサポートするクライアント/プログラムインターフェイス(JDBC 、 ODBC、Pythonなど)で使用できます。

使用上の注意

  • リテラルと変数(セッションまたはバインド)は、オブジェクトを名前(クエリ、 DML 、 DDLなど)で識別できる場所であればどこでも使用できます。

  • オブジェクト識別子のバインドは、値のバインドと同じクエリで使用できます。

文字列リテラル:

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
    $$
    186250
    $$;

名前で関数を呼び出します。

SELECT SPEED_OF_LIGHT();
+------------------+
| SPEED_OF_LIGHT() |
|------------------|
|           186250 |
+------------------+

IDENTIFIER()構文を使用して関数を呼び出します。

SET MY_FUNCTION_NAME = 'speed_of_light';
SELECT IDENTIFIER($MY_FUNCTION_NAME)();
+---------------------------------+
| IDENTIFIER($MY_FUNCTION_NAME)() |
|---------------------------------|
|                          186250 |
+---------------------------------+

バインド変数:

この例は、 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 $$ 186250 $$";
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 (MPH) = " + rs.getInt(1));
}

次の例は、バインディングを使用できるさまざまな SQL ステートメントと、バインドできるさまざまなデータベースオブジェクト(スキーマ名やテーブル名を含む)を示しています。

use schema identifier(?);

create or replace table identifier(?) (c1 number);

insert into table identifier(?) values (?), (?), (?);

select t2.c1 from identifier(?) as t1, identifier(?) as t2 where t1.c1 = t2.c1 and t1.c1 > (?);

drop table identifier(?);