Snowflake中能否用SET变量存储列名并在SUM函数中使用?
解决Snowflake中用变量存储列名列表实现多列求和的问题
问题原因
你通过SET定义的$col本质是一个字符串值(例如'col1+col2+col3'),直接放入SUM($col)时,Snowflake会将这个字符串当作数值解析,自然会触发“无法识别数值”的错误——因为它并非合法数值,只是列名拼接的字符串。
解决方案:使用动态SQL
要让Snowflake将变量中的字符串视为SQL表达式执行,需借助动态SQL,通过EXECUTE IMMEDIATE实现,具体步骤如下:
- 先定义变量存储列名拼接的表达式:
set col = (select listagg(column_name, '+') from information_schema.columns where table_name='tbl_nm');
- 构造并执行动态SQL语句:
execute immediate 'select sum(' || $col || ') from tbl_nm';
执行时Snowflake会先替换$col的字符串值,生成完整的select sum(col1+col2+col3+...) from tbl_nm语句,再执行该语句即可得到预期的求和结果。
额外提示
- 若表位于特定数据库或schema下,需在
information_schema.columns的查询中补充table_schema='你的schema名'和table_catalog='你的数据库名',避免匹配到其他同名表的列。 - 确保
listagg拼接的列均为数值型,否则求和时会触发类型错误,与手动编写sum(col1+col2)的要求一致。
内容的提问来源于stack exchange,提问作者Chloe
相关产品推荐
相关产品推荐

