SET VARIABLE and RESET VARIABLE Statements
Goose 支持使用 SET VARIABLE 和 RESET VARIABLE 语句定义 SQL 级变量。
变量作用域
Goose 支持两级变量作用域:
| 作用域 | 说明 |
|---|---|
SESSION | SESSION 作用域的变量仅对当前会话可见,只影响当前会话。 |
GLOBAL | GLOBAL 作用域的变量是特定的配置项变量,会影响整个 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);
| a | filename |
|---|---|
| 42 | test.csv |
| 84 | test2.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;
| col0 | col2 |
|---|---|
| 12 | 56 |
语法
RESET VARIABLE
RESET VARIABLE 语句用于取消设置变量。
SET VARIABLE my_var = 30;
RESET VARIABLE my_var;
SELECT getvariable('my_var') AS my_var;
| my_var |
|---|
| NULL |