我需要创建一个每天运行的 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
使用 @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