将字面量和变量用作标识符

在 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 变量。

使用说明

  • 在某些情况下,需要根据名称识别对象时(查询、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              |
+---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+
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 变量:

此示例展示了如何使用 Snowflake Scripting 变量作为 SELECT 语句中的表名称:

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