SQL 变量

您可以在 Snowflake 的会话中定义和使用 SQL 变量。

本主题内容:

概述

Snowflake 支持用户声明的 SQL 变量。它们具有许多用途,例如存储应用程序特定的环境设置。

变量标识符

SQL 变量使用不区分大小写的名称进行全局标识。

变量 DDL

Snowflake 提供了以下使用 SQL 变量的 DDL 命令:

初始化变量

您可以通过执行 SQL 语句 SET 或在连接到 Snowflake 时在连接字符串中设置变量的方式来设置变量。

字符串或二进制变量的大小限制为 256 字节。

使用 SQL 初始化会话中的变量

可以使用 SET 命令在 SQL 中初始化变量。变量的数据类型派生自计算表达式结果的数据类型。

SET my_variable=10;
SET my_variable='example';
Copy

可以在同一语句中初始化多个变量,从而减少与服务器的往返通信次数。

SET (var1, var2, var3)=(10, 20, 30);
SET (var1, var2, var3)=(SELECT 10, 20, 30);
Copy

在连接时设置变量

除了使用 SET 在会话中设置变量之外,在 Snowflake 中用于初始化会话的连接字符串中,您还可以将变量作为实参传递。如果连接字符串的规范是唯一可能的自定义工具,则此选项特别有用。

例如,使用 Snowflake JDBC 驱动程序,您可以对将解释为参数的其他连接属性进行设置。请注意,JDBC API 要求 SQL 变量是字符串。

// Build connection properties
Properties properties = new Properties();

// Required connection properties
properties.put("user"    ,  "jsmith"      );
properties.put("password",  "mypassword");
properties.put("account" ,  "myaccount");

// Set some additional variables.
properties.put("$variable_1", "some example");
properties.put("$variable_2", "1"           );

// Create a new connection
String connectStr = "jdbc:snowflake://localhost:8080";

// Open a connection under the snowflake account and enable variable support
Connection con = DriverManager.getConnection(connectStr, properties);
Copy

在 SQL 中使用变量

可以在 Snowflake 中任何允许使用字面量常量的地方使用变量,文档中注明者除外。若要将它们从绑定值和列名中区分开来,所有变量都必须以 $ 符号为前缀。

例如:

SET (min, max)=(40, 70);

SELECT $min;

SELECT AVG(salary) FROM emp WHERE age BETWEEN $min AND $max;
Copy

备注

由于 $ 符号是用于标识 SQL 语句中变量的前缀,因此在标识符中使用时将其视为特殊字符。标识符(数据库名称、表名称、列名称等)不能以特殊字符开头,除非整个名称用双引号括起来。有关更多信息,请参阅 对象标识符

变量还可以包含标识符名称,例如表名称。若要使用变量作为标识符,您必须将其封装在 IDENTIFIER() 中,例如 IDENTIFIER($my_variable)。以下是一些示例:

SET my_table_name='table1';
Copy
CREATE TABLE IDENTIFIER($my_table_name) (i INTEGER);
INSERT INTO IDENTIFIER($my_table_name) (i) VALUES (42);
Copy
SELECT * FROM IDENTIFIER($my_table_name);
Copy
+----+
|  I |
|----|
| 42 |
+----+

在 FROM 子句的上下文中,可以将变量名称封装在 TABLE() 中,如下所示:

SELECT * FROM TABLE($my_table_name);
Copy
+----+
|  I |
|----|
| 42 |
+----+
DROP TABLE IDENTIFIER($my_table_name);
Copy

有关 IDENTIFIER() 的更多信息,请参阅 将字面量和变量用作标识符

查看会话的变量

若要查看当前会话中定义的所有变量,请使用 SHOW VARIABLES 命令:

SET (min, max)=(40, 70);
Copy
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SHOW VARIABLES;
Copy
+----------------+-------------------------------+-------------------------------+------+-------+-------+---------+
|     session_id | created_on                    | updated_on                    | name | value | type  | comment |
|----------------+-------------------------------+-------------------------------+------+-------+-------+---------|
| 10363773891062 | 2024-06-28 10:09:57.990 -0700 | 2024-06-28 10:09:58.032 -0700 | MAX  | 70    | fixed |         |
| 10363773891062 | 2024-06-28 10:09:57.990 -0700 | 2024-06-28 10:09:58.021 -0700 | MIN  | 40    | fixed |         |
+----------------+-------------------------------+-------------------------------+------+-------+-------+---------+

会话变量函数

为操作会话变量提供以下方便使用的函数,以支持与其他数据库系统的兼容性,并通过不支持 $ 语法的工具发出 SQL,以便访问变量。请注意,所有这些函数都接受并返回字符串形式的会话变量值:

  • SYS_CONTEXT 和 SET_SYS_CONTEXT 中的限制

  • SESSION_CONTEXT 和 SET_SESSION_CONTEXT 中的限制

  • GETVARIABLE 和 SETVARIABLE 中的限制

以下是使用 GETVARIABLE 的示例。首先,使用 SET 命令定义变量:

SET var_artist_name = 'Jackson Browne';
Copy
+----------------------------------+
| status                           |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+

返回变量值:

SELECT GETVARIABLE('var_artist_name');
Copy

在此示例中,输出是 NULL,因为 Snowflake 存储的变量都是大写字母。

更新大小写:

SELECT GETVARIABLE('VAR_ARTIST_NAME');
Copy
+--------------------------------+
| GETVARIABLE('VAR_ARTIST_NAME') |
+--------------------------------+
| Jackson Browne                 |
+--------------------------------+

您可以在 WHERE 子句中使用变量名称,例如:

SELECT album_title
  FROM albums
  WHERE artist = $var_artist_name;
Copy

移除变量

SQL 变量是会话专用的。关闭 Snowflake 会话时,将删除会话期间创建的所有变量。这意味着任何人都无法访问已在其他会话中设置的用户定义变量,并且当会话关闭时,这些变量会过期。

此外,始终可以使用 UNSET 命令显式销毁变量。

例如:

UNSET my_variable;
Copy
语言: 中文