식별자로서의 리터럴과 변수

Snowflake SQL 문에서는 이름으로 오브젝트를 지칭하는 것 외에(식별자 요구 사항 참조), 문자열 리터럴, 세션 변수, 바인드 변수 또는 Snowflake Scripting 변수 를 사용하여 오브젝트를 지칭할 수도 있습니다. 예를 들어 SELECT 문의 FROM 절에서 테이블 이름으로 설정된 세션 변수를 사용할 수 있습니다.

리터럴이나 변수에 지정된 오브젝트 이름을 사용하려면 IDENTIFIER()를 사용하십시오.

구문

IDENTIFIER( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } )
Copy
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 Scripting 변수 입니다.

사용법 노트

  • 이름(쿼리, 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              |
+---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+
Copy

세션 변수:

다음은 테이블 이름 또는 스키마 이름을 가진 세션 변수의 사용법을 보여줍니다.

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  |
+----+
Copy

다음은 함수 이름을 가진 세션 변수의 사용법을 보여줍니다. 이 함수는 speed_of_light 로 명명됩니다.

CREATE FUNCTION speed_of_light() 
RETURNS INTEGER
AS
    $$
    299792458
    $$;
Copy

이름으로 함수를 호출합니다.

SELECT SPEED_OF_LIGHT();
+------------------+
| SPEED_OF_LIGHT() |
|------------------|
|        299792458 |
+------------------+
Copy

IDENTIFIER() 구문을 사용해 함수를 호출합니다.

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

바인드 변수:

이 예에서는 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));
}
Copy

다음 예에서는 바인딩을 사용할 수 있는 다양한 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(?);
Copy

Snowflake Scripting 변수:

이 예에서는 SELECT 문에서 테이블 이름에 대한 Snowflake Scripting 변수를 사용하는 방법을 보여줍니다.

BEGIN
  LET res RESULTSET := (SELECT COUNT(*) AS COUNT FROM IDENTIFIER(:table_name));
  ...
Copy