![](/img/trans.png)
[英]Identify if a column is Virtual in Snowflake without SHOW COLUMNS
[英]Identify if a column is Virtual in Snowflake
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怎么樣? 當表達式字段不是 null 時,您應該識別它們。
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_name>;' 你會得到一個名為kind的列,它會告訴你它是否是虛擬的,如果它沒有默認值,也會單獨有默認值 NULL 。
名稱 | 類型 | 種類 | null? | 默認 | 首要的關鍵 | 唯一鍵 | 查看 | 表達 | 評論 | 保單名稱 |
---|---|---|---|---|---|---|---|---|---|---|
ID | 數字(38,0) | 柱子 | 否 | 身份開始 1 增量 1 | 是 | 否 | ||||
用戶名 | 變量(30) | 柱子 | 是 | 否 | 否 | |||||
插入_DT | 時間戳_NTZ(9) | 柱子 | 否 | CAST(CONVERT_TIMEZONE('UTC', CAST(CURRENT_TIMESTAMP() AS TIMESTAMP_TZ(9))) AS TIMESTAMP_NTZ(9)) | 否 | 否 | ||||
第二天插入 | 時間戳_NTZ(9) | 虛擬的 | 是 | 否 | 否 | DATE_ADDDAYSTOTIMESTAMP(1, INSERT_DT) |
A/ 使用 'desc table <table_name>' 可以獲得表的元數據,其中包含一個名為kind的列,這將顯示VIRTUAL或COLUMN 。 如果它是 VIRTUAL,則在列表達式中您將了解該列的計算方式。
這在存儲過程中使用,並保存在 arrays 和 javascript 的數組中,從那里動態創建存儲過程中的下一個查詢。 while 循環用於 go 通過 resultSet 並將每一行推送到 arrays 的數組中。然后您可以使用 javascript 過濾器來獲取虛擬列。 這是在 Snowflake 存儲過程中混合使用 javascript 和 SQL 的部分優勢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.