5

Snowflake 没有记录其使用 AS 子句的虚拟列功能。我正在进行迁移,需要以编程方式过滤掉虚拟列。

有什么方法可以识别列是虚拟的吗?该Information Schema.COLLUMNS视图显示虚拟列定义和非虚拟列定义之间没有什么不同。

4

3 回答 3

3

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
于 2021-08-07T07:42:34.887 回答
1

使用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          |
于 2021-08-06T19:12:56.313 回答
0

我通常使用 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,即VIRTUALCOLUMN。如果它是虚拟的,那么在列表达式中,您会得到该列的计算方式。

这在存储过程中使用,并使用 javascript 保存在数组数组中,从那里动态创建存储过程中的下一个查询。while 循环用于遍历结果集并将每一行推入数组数组。然后,您可以使用 javascript 过滤器来获取虚拟列。这是在雪花存储过程中混合使用 javascript 和 SQL 的优势的一部分。

这里的文档并没有说太多。

于 2021-10-04T19:36:50.293 回答