2

我在 Snowflake 中有一个表,profile并且exclusion想要按原样提取profile_idprofile_name同时按此列存在于排除表中的方式提取。transaction_count'null'

我想为配置文件表中的所有列动态地执行此操作,因为表中配置文件表的列名称exclusion将根据业务需求而变化。

示例表:

轮廓:

profile_id profile_name 交易计数
1 普里亚 3

排除:

表名 列名
轮廓 交易计数

这可以在 SQL 中完成吗?还是在存储过程中?

4

2 回答 2

2

您可以使用匿名块更动态地构建更新 sql stmt,现在我正在从表的信息模式中获取所有列并使用它来构建列列表。使用相同的列列表在 TBL 配置文件中进行更新。如果您想拥有自己的包含列列表的表“排除”,只需简单地更改您选择查询并使其工作。下面是代码块:

    execute immediate $$
      declare
        accumulator varchar default '';
        res1 RESULTSET default (Select column_name   from "LIBRARY_CARD_CATALOG"."INFORMATION_SCHEMA"."COLUMNS" where table_schema='PUBLIC' and table_name='PROFILE' );  
        cur1 CURSOR for res1;     
        upd_stmt varchar;
      begin
        for row_variable in cur1 do
          accumulator := row_variable.column_name||'=NULL'||','||accumulator;
        end for;
        accumulator:=RTRIM(accumulator,',');
        upd_stmt:= 'update "LIBRARY_CARD_CATALOG"."PUBLIC"."PROFILE" set '|| accumulator||';';
        execute immediate  :upd_stmt;
         return upd_stmt;
      end;
    $$;

在此处输入图像描述

于 2022-01-28T17:36:16.153 回答
1

您可以查询排除的列并转换为数组,然后,如果字段名称出现在该数组中,则可以将每个字段强制转换为 NULL。

注意:当我开始解决时,我意识到我的解决方案很冗长且不理想。我假设有一个更好的方法,可能带有JOINS或带有UDF. 在这里留下我的答案,因为它确实有效,直到有人用更好的解决方案代替。

为排除列创建一个 CTE 并应用于您的业务表的查询:

WITH EXCLUDE(EXCLUDE_COLUMNS) AS (
    SELECT
        TO_ARRAY(column_name) AS EXCLUDE_COLUMNS
    FROM
        exclusion
)
-- Now make your query
SELECT
    CASE
       WHEN 
           'profile_id' IN EXCLUDE.EXCLUDE_COLUMNS
       THEN
           profile_id
       ELSE NULL
    END AS profile_id,
    ....  -- Continue for each column
FROM
    profile
于 2022-01-28T16:32:20.203 回答