根据另一个雪花 table 更新雪花 table 中的列
Update a column in snowflake table based on another snowflake table
我有两片雪花table。 Table 'TEST' 有 3 列,其中 'HASH_KEY' 列正在更新为列 'name' 和 'id' 的连接,如下面的代码所示。
create OR REPLACE table TEST (
id varchar(100),
name varchar(100),
HASH_KEY VARCHAR(64)
);
INSERT INTO TEST values (100, 'ABC', null);
INSERT INTO TEST values (200, 'XYZ', null);
update TEST set HASH_KEY = CONCAT_WS('|',id,name);
以上代码完全可以正常工作
我的要求不是在更新语句中对 id 和 name 列进行硬编码。我想使用控件 table
中的 'KEY_COLUMNS' 列实现相同的功能
我的控件table如下所示
create OR REPLACE table CONTROL_TABLE (
KEY_COLUMNS VARCHAR,
COL1 VARCHAR,
COL2 VARCHAR
);
INSERT INTO CONTROL_TABLE values ('id,name', null, null);
KEY_COLUMNS 列的值为 id、name,因此我的更新语句应该从测试 table 中选择这些列,并像下面这样连接这些列的值
update TEST set HASH_KEY = CONCAT_WS('|', (select KEY_COLUMNS from CONTROL_TABLE));
我低于 HASH_KEY 列的值
id,name
id,name
HASH_KEY 列的预期值
100|ABC
200|XYZ
正如您所做的那样,让我们设置一些数据:
create OR REPLACE table TEST (
id varchar(100),
name varchar(100),
HASH_KEY VARCHAR(64)
);
INSERT INTO TEST values
(100, 'ABC', null),
(200, 'XYZ', null);
我已经把CONTROL_TABLE
改成有来源的名字table
create OR REPLACE table CONTROL_TABLE (
KEY_COLUMNS VARCHAR,
table_name VARCHAR,
COL2 VARCHAR
);
INSERT INTO CONTROL_TABLE values ('id,name', 'TEST', null);
现在我们可以使用 Snowflake Scripting 动态构建我们的 SQL:
DECLARE
source_tbl STRING := 'TEST';
hash_columns STRING;
query STRING;
BEGIN
SELECT KEY_COLUMNS INTO :hash_columns FROM CONTROL_TABLE WHERE table_name = :source_tbl;
QUERY := 'update '|| source_tbl ||' set HASH_KEY = CONCAT_WS(\'|\','|| :hash_columns ||');';
EXECUTE IMMEDIATE :QUERY;
RETURN :QUERY;
END;
和 return 是 运行:
的更新
anonymous block
update TEST set HASH_KEY = CONCAT_WS('|',id,name);
对于 classic console 换行 execute immediate $$<block>$$
execute immediate $$
DECLARE
source_tbl STRING := 'TEST';
hash_columns STRING;
query STRING;
BEGIN
SELECT KEY_COLUMNS INTO :hash_columns FROM CONTROL_TABLE WHERE table_name = :source_tbl;
QUERY := 'update '|| source_tbl ||' set HASH_KEY = CONCAT_WS(\'|\','|| :hash_columns ||');';
EXECUTE IMMEDIATE :QUERY;
RETURN :QUERY;
END;
$$;
如果我们检查数据:
SELECT * from test;
看到了我们期望的结果:
ID
NAME
HASH_KEY
100
ABC
100|ABC
200
XYZ
200|XYZ
我有两片雪花table。 Table 'TEST' 有 3 列,其中 'HASH_KEY' 列正在更新为列 'name' 和 'id' 的连接,如下面的代码所示。
create OR REPLACE table TEST (
id varchar(100),
name varchar(100),
HASH_KEY VARCHAR(64)
);
INSERT INTO TEST values (100, 'ABC', null);
INSERT INTO TEST values (200, 'XYZ', null);
update TEST set HASH_KEY = CONCAT_WS('|',id,name);
以上代码完全可以正常工作 我的要求不是在更新语句中对 id 和 name 列进行硬编码。我想使用控件 table
中的 'KEY_COLUMNS' 列实现相同的功能我的控件table如下所示
create OR REPLACE table CONTROL_TABLE (
KEY_COLUMNS VARCHAR,
COL1 VARCHAR,
COL2 VARCHAR
);
INSERT INTO CONTROL_TABLE values ('id,name', null, null);
KEY_COLUMNS 列的值为 id、name,因此我的更新语句应该从测试 table 中选择这些列,并像下面这样连接这些列的值
update TEST set HASH_KEY = CONCAT_WS('|', (select KEY_COLUMNS from CONTROL_TABLE));
我低于 HASH_KEY 列的值
id,name
id,name
HASH_KEY 列的预期值
100|ABC
200|XYZ
正如您所做的那样,让我们设置一些数据:
create OR REPLACE table TEST (
id varchar(100),
name varchar(100),
HASH_KEY VARCHAR(64)
);
INSERT INTO TEST values
(100, 'ABC', null),
(200, 'XYZ', null);
我已经把CONTROL_TABLE
改成有来源的名字table
create OR REPLACE table CONTROL_TABLE (
KEY_COLUMNS VARCHAR,
table_name VARCHAR,
COL2 VARCHAR
);
INSERT INTO CONTROL_TABLE values ('id,name', 'TEST', null);
现在我们可以使用 Snowflake Scripting 动态构建我们的 SQL:
DECLARE
source_tbl STRING := 'TEST';
hash_columns STRING;
query STRING;
BEGIN
SELECT KEY_COLUMNS INTO :hash_columns FROM CONTROL_TABLE WHERE table_name = :source_tbl;
QUERY := 'update '|| source_tbl ||' set HASH_KEY = CONCAT_WS(\'|\','|| :hash_columns ||');';
EXECUTE IMMEDIATE :QUERY;
RETURN :QUERY;
END;
和 return 是 运行:
的更新anonymous block |
---|
update TEST set HASH_KEY = CONCAT_WS('|',id,name); |
对于 classic console 换行 execute immediate $$<block>$$
execute immediate $$
DECLARE
source_tbl STRING := 'TEST';
hash_columns STRING;
query STRING;
BEGIN
SELECT KEY_COLUMNS INTO :hash_columns FROM CONTROL_TABLE WHERE table_name = :source_tbl;
QUERY := 'update '|| source_tbl ||' set HASH_KEY = CONCAT_WS(\'|\','|| :hash_columns ||');';
EXECUTE IMMEDIATE :QUERY;
RETURN :QUERY;
END;
$$;
如果我们检查数据:
SELECT * from test;
看到了我们期望的结果:
ID | NAME | HASH_KEY |
---|---|---|
100 | ABC | 100|ABC |
200 | XYZ | 200|XYZ |