跳到主要内容

SET VARIABLE and RESET VARIABLE Statements

Goose 支持使用 SET VARIABLERESET VARIABLE 语句定义 SQL 级变量。

变量作用域

Goose 支持两级变量作用域:

作用域说明
SESSIONSESSION 作用域的变量仅对当前会话可见,只影响当前会话。
GLOBALGLOBAL 作用域的变量是特定的配置项变量,会影响整个 Goose 实例及所有会话。例如,参见 Set a Global Variable

SET VARIABLE

SET VARIABLE 语句用于为变量赋值,可通过 getvariable 调用访问该值:

SET VARIABLE my_var = 30;
SELECT 20 + getvariable('my_var') AS total;
total
50

如果对已存在的变量执行 SET VARIABLE,其值会被覆盖:

SET VARIABLE my_var = 30;
SET VARIABLE my_var = 100;
SELECT 20 + getvariable('my_var') AS total;
total
120

变量可以是不同的数据类型:

SET VARIABLE my_date = DATE '2018-07-13';
SET VARIABLE my_string = 'Hello world';
SET VARIABLE my_map = MAP {'k1': 10, 'k2': 20};

变量也可以赋值为查询结果:

-- 写入一些 CSV 文件
COPY (SELECT 42 AS a) TO 'test1.csv';
COPY (SELECT 84 AS a) TO 'test2.csv';

-- 将 CSV 文件列表写入表
CREATE TABLE csv_files (file VARCHAR);
INSERT INTO csv_files VALUES ('test1.csv'), ('test2.csv');

-- 用 CSV 文件列表初始化变量
SET VARIABLE list_of_files = (SELECT list(file) FROM csv_files);

-- 读取 CSV 文件
SELECT * FROM read_csv(getvariable('list_of_files'), filename := True);
afilename
42test.csv
84test2.csv

如果变量未设置,getvariable 函数将返回 NULL

SELECT getvariable('undefined_var') AS result;
result
NULL

getvariable 函数也可用于 COLUMNS 表达式

SET VARIABLE column_to_exclude = 'col1';
CREATE TABLE tbl AS SELECT 12 AS col0, 34 AS col1, 56 AS col2;
SELECT COLUMNS(c -> c != getvariable('column_to_exclude')) FROM tbl;
col0col2
1256

语法

RESET VARIABLE

RESET VARIABLE 语句用于取消设置变量。

SET VARIABLE my_var = 30;
RESET VARIABLE my_var;
SELECT getvariable('my_var') AS my_var;
my_var
NULL

语法