IDENTIFIER() 구문으로 리터럴·변수를 식별자로 사용
IDENTIFIER() 구문으로 리터럴·변수를 식별자로 사용
Snowflake SQL 문장에서 객체를 이름으로 참조하는 것(식별자 요구 사항 참고)에 더해, 문자열 리터럴, 세션 변수, 바인드 변수 또는 Snowflake Scripting 변수로 객체를 참조할 수도 있습니다. 예를 들어 SELECT 문장의 FROM 절에서 테이블 이름으로 설정된 세션 변수를 사용할 수 있습니다. 리터럴이나 변수에 지정된 객체 이름을 사용하려면 IDENTIFIER() 구문을 사용하세요.
IDENTIFIER()로 데이터베이스 객체를 식별하는 것은 코드를 더 재사용 가능하게 만들고 SQL injection 위험을 방지하는 데 도움이 되므로 모범 사례입니다.
본문
구문 (Syntax)
IDENTIFIER( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } )
string_literal
객체의 이름을 식별하는 문자열:
- 문자열은 작은따옴표로 감싸야 하거나(
'name') 달러 기호로 시작해야 합니다($name). - 문자열 리터럴은 정규화된(full-qualified) 객체 이름일 수 있습니다(예:
'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 같은 명령이 반환하지 않습니다.
예제
다음 예제들은 IDENTIFIER() 구문을 사용합니다.
문자열 리터럴과 함께 IDENTIFIER() 구문 사용
이 예제들은 문자열 리터럴에 객체 식별자가 들어 있을 때 객체를 참조하는 방법을 보여줍니다.
데이터베이스 생성:
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. |
+----------------------------------------+
정규화된 이름이 들어 있는 문자열로 지정된 대소문자 무시 테이블 이름으로 테이블 생성:
CREATE OR REPLACE TABLE IDENTIFIER('my_db.my_schema.my_table') (c1 number);
+--------------------------------------+
| status |
|--------------------------------------|
| Table MY_TABLE successfully created. |
+--------------------------------------+
큰따옴표 문자열로 지정된 대소문자 구분 테이블 이름으로 테이블 생성:
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 | ... |
|-------------------------------+----------+---------------+-------------+-------+---------+---------|
| 2024-07-03 08:55:11.992 -0700 | MY_TABLE | MY_DB | MY_SCHEMA | TABLE | | ... |
| 2024-07-03 08:56:00.604 -0700 | my_table | MY_DB | MY_SCHEMA | TABLE | | ... |
+-------------------------------+----------+---------------+-------------+-------+---------+---------+
세션 변수와 함께 IDENTIFIER() 구문 사용
이 예제들은 테이블 이름이나 스키마 이름을 가진 세션 변수를 사용하는 방법을 보여줍니다.
스키마 이름에 대한 세션 변수 설정:
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 |
+---------------------------------+
바인드 변수와 함께 IDENTIFIER() 구문 사용
이 예제들은 객체를 식별하기 위해 바인드 변수를 사용하는 방법을 보여줍니다.
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 Scripting 변수와 함께 IDENTIFIER() 구문 사용
이 예제는 SELECT 문장에서 테이블 이름에 Snowflake Scripting 변수를 사용하는 방법을 보여줍니다:
BEGIN
LET res RESULTSET := (SELECT COUNT(*) AS COUNT FROM IDENTIFIER(:table_name));
...