簡體   English   中英

確定列是否在 Snowflake 中是虛擬的

[英]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的列,這將顯示VIRTUALCOLUMN 如果它是 VIRTUAL,則在列表達式中您將了解該列的計算方式。

這在存儲過程中使用,並保存在 arrays 和 javascript 的數組中,從那里動態創建存儲過程中的下一個查詢。 while 循環用於 go 通過 resultSet 並將每一行推送到 arrays 的數組中。然后您可以使用 javascript 過濾器來獲取虛擬列。 這是在 Snowflake 存儲過程中混合使用 javascript 和 SQL 的部分優勢。

這里文檔里面就不多說了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM