Snowflake 动态 SQL 从另一个表中不确定数量的值中选择一个表中的列子集

问题描述 投票:0回答:1

我需要创建一个每天运行的 SQL 脚本并从表 A 中选择列的子集。 列的子集在表 B 中定义 - 它将由营销团队定期编辑,并且可以具有表 A 中列的任何子集

示例:

Table_A has 100 columns: [Column1], [Column2], ..., [Column100]

Table_B has 1 column: [ColumnNames] with the values 'Column1', 'Column3', 'Column8'

如何编写动态查询

SELECT **Column1, Column3, Column8**
FROM Table_A

列列表(粗体)来自查询

SELECT LISTAGG(DISTINCT ColumnNames, ', ')
FROM Table_B 

我尝试了以下方法:

SET ColumnList = (SELECT LISTAGG(DISTINCT ColumnNames, ', ') FROM Table_B );
SET SQLScript = (SELECT CONCAT('SELECT ', $ColumnList, ' FROM Table_A'));
EXECUTE IMMEDIATE $SQLScript;

只要变量 SQLScript 的字符大小不超过 256,这种方法就可以正常工作,但我不能指望这是真的,因为营销可能会选择在 Table_B 中包含许多 ColumnNames

sql snowflake-cloud-data-platform dynamic-sql
1个回答
0
投票

使用 @Mat 在其评论中建议的样式,包含 500 列:

EXECUTE IMMEDIATE $$
    BEGIN   
        let concat_cols string := (
            select listagg(x, ', ') 
            from (select a.$1 x from values('a'),('b'),('c') a 
            join (select 1 from TABLE(GENERATOR(ROWCOUNT => 500))))
            );
        let long_select string := 'select ' || concat_cols || ' from (select 1 a, 2 b, 3 c)';
        let res resultset := (EXECUTE IMMEDIATE long_select);
        return table(res);
    END;
$$
;

https://docs.snowflake.com/en/developer-guide/snowflake-scripting/variables

© www.soinside.com 2019 - 2024. All rights reserved.