将字面量和变量用作标识符¶
在 Snowflake SQL 语句中,除了按名称引用对象(请参阅 标识符要求)之外,您还可以使用字符串字面量、会话变量、绑定变量或 Snowflake Scripting 变量 来引用对象。例如,可以在 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 Scripting 变量。
使用说明¶
在某些情况下,需要根据名称识别对象时(查询、DDL、DML 等),可以使用字面量和变量(会话或绑定)。
在同一个查询中,您可以为对象标识符使用绑定变量,还可以为值使用绑定变量。
在
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 Scripting 变量:
此示例展示了如何使用 Snowflake Scripting 变量作为 SELECT 语句中的表名称:
BEGIN LET res RESULTSET := (SELECT COUNT(*) AS COUNT FROM IDENTIFIER(:table_name)); ...