根据另一个雪花 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