Snowflake 没有记录其使用 AS 子句的虚拟列功能。我正在进行迁移,需要以编程方式过滤掉虚拟列。
有什么方法可以识别列是虚拟的吗?该Information Schema.COLLUMNS
视图显示虚拟列定义和非虚拟列定义之间没有什么不同。
Snowflake 没有记录其使用 AS 子句的虚拟列功能。我正在进行迁移,需要以编程方式过滤掉虚拟列。
有什么方法可以识别列是虚拟的吗?该Information Schema.COLLUMNS
视图显示虚拟列定义和非虚拟列定义之间没有什么不同。
DEFAULT
定义为和VIRTUAL COLUMN
(又名计算的、生成的列)的列之间存在差异:
CREATE OR REPLACE TABLE T1(i INT, calc INT AS (i*i));
INSERT INTO T1(i) VALUES (2),(3),(4);
SELECT * FROM T1;
使用AS (expression)
语法时,表达式在以下位置不可见COLUMN_DEFAULT
:
在定义的情况下DEFAULT (expression)
:
CREATE OR REPLACE TABLE T2(i INT, calc INT DEFAULT (i*i));
INSERT INTO T2(i) VALUES (2),(3),(4);
SELECT * FROM T2;
它可见于COLUMN_DEFAULT
:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'T2';
与SHOW COLUMNS并排比较:
SHOW COLUMNS LIKE 'CALC';
-- kind: VIRTUAL_COLUMN
它们之间的一个显着区别是虚拟列无法更新:
UPDATE T1
SET calc = 1;
-- Virtual column 'CALC' is invalid target.
UPDATE T2
SET calc = 1;
-- success
使用SHOW COLUMNS怎么样?当表达式 字段不为空时,您应该识别它们。
create table foo (id bigint, derived bigint as (id * 10));
insert into foo (id) values (1), (2), (3);
SHOW COLUMNS IN TABLE foo;
SELECT "table_name", "column_name", "expression" FROM table(result_scan(last_query_id()));
| table_name | column_name | expression |
| ---------- | ----------- | -------------- |
| FOO | ID | null |
| FOO | DERIVED | ID*10 |
我通常使用 desc 表选项。
首先让我们用一些示例数据创建表:
create or replace temporary table ColumnTypesTest (
id int identity(1,1) primary key,
userName varchar(30),
insert_DT datetime default CAST(CONVERT_TIMEZONE('UTC', CAST(CURRENT_TIMESTAMP() AS TIMESTAMP_TZ(9))) AS TIMESTAMP_NTZ(9)) not null,
nextDayAfterInsert datetime as dateadd(dd,1,insert_DT)
);
insert into ColumnTypesTest (userName) values
('John'),
('Cris'),
('Anne');
select * from ColumnTypesTest;
ID | 用户名 | 插入_DT | 次日后插入 |
---|---|---|---|
1 | 约翰 | 2021-10-04 19:11:21.069 | 2021-10-05 19:11:21.069 |
2 | 克里斯 | 2021-10-04 19:11:21.069 | 2021-10-05 19:11:21.069 |
3 | 安妮 | 2021-10-04 19:11:21.069 | 2021-10-05 19:11:21.069 |
现在回答你的问题
使用 'desc table <table_name>;' 你会得到一个名为kind的列,它会告诉你它是否是虚拟的,如果它没有默认值,则另外还有默认值为 NULL 。
姓名 | 类型 | 种类 | 无效的? | 默认 | 首要的关键 | 唯一键 | 查看 | 表达 | 评论 | 政策名称 |
---|---|---|---|---|---|---|---|---|---|---|
ID | 号码(38,0) | 柱子 | ñ | 身份开始 1 增量 1 | 是 | ñ | ||||
用户名 | VARCHAR(30) | 柱子 | 是 | ñ | ñ | |||||
插入_DT | TIMESTAMP_NTZ(9) | 柱子 | ñ | CAST(CONVERT_TIMEZONE('UTC', CAST(CURRENT_TIMESTAMP() 作为 TIMESTAMP_TZ(9))) 作为 TIMESTAMP_NTZ(9)) | ñ | ñ | ||||
次日后插入 | TIMESTAMP_NTZ(9) | 虚拟的 | 是 | ñ | ñ | DATE_ADDDAYSTOTIMESTAMP(1, INSERT_DT) |
A/ 使用 'desc table <table_name>' 你会得到表的元数据,其中有一列名为kind,即VIRTUAL或COLUMN。如果它是虚拟的,那么在列表达式中,您会得到该列的计算方式。
这在存储过程中使用,并使用 javascript 保存在数组数组中,从那里动态创建存储过程中的下一个查询。while 循环用于遍历结果集并将每一行推入数组数组。然后,您可以使用 javascript 过滤器来获取虚拟列。这是在雪花存储过程中混合使用 javascript 和 SQL 的优势的一部分。