如何在Snowflake中编写CASE语句实现跨Schema JSON字段查询
Snowflake 查询修正方案
你的原查询存在两个核心问题:
- CASE 表达式只能返回单个值,无法在一个CASE里同时输出多列,这会导致语法错误
- 使用了中文单引号
‘’,SQL要求必须用英文单引号''
针对你的需求,提供两种可行实现方式:
方式一:固定结果列(推荐)
无论&{schema}取值如何,结果集保留所有可能的字段,对应schema的字段填充值,其余为NULL。这种方式避免动态列带来的兼容性问题:
SELECT cs.id, -- vai_public 专属字段 CASE WHEN '&{schema}' = 'vai_public' THEN parse_json(cs.custom_fields):assignee_email::STRING END AS assignee_email, CASE WHEN '&{schema}' = 'vai_public' THEN parse_json(cs.custom_fields):assignment_group_value::STRING END AS assignment_group_value, CASE WHEN '&{schema}' = 'vai_public' THEN parse_json(cs.custom_fields):case_label_list::STRING END AS case_label_list, -- snow_public 专属字段 CASE WHEN '&{schema}' = 'snow_public' THEN parse_json(cs.custom_fields):manager_name::STRING END AS manager_name, CASE WHEN '&{schema}' = 'snow_public' THEN parse_json(cs.custom_fields):origin::STRING END AS origin, CASE WHEN '&{schema}' = 'snow_public' THEN parse_json(cs.custom_fields):priority_support_c::STRING END AS priority_support_c FROM vaibhav_database.&{schema}.my_table AS cs;
方式二:动态生成列(需使用存储过程/脚本)
如果需要结果列完全随&{schema}动态变化(只返回对应schema的字段),静态SQL无法实现,需用动态SQL。示例如下(使用Snowflake脚本):
SET schema_var = '&{schema}'; DECLARE sql_stmt STRING; BEGIN IF ($schema_var = 'vai_public') THEN sql_stmt := 'SELECT id, parse_json(custom_fields):assignee_email::STRING AS assignee_email, parse_json(custom_fields):assignment_group_value::STRING AS assignment_group_value, parse_json(custom_fields):case_label_list::STRING AS case_label_list FROM vaibhav_database.vai_public.my_table'; ELSIF ($schema_var = 'snow_public') THEN sql_stmt := 'SELECT id, parse_json(custom_fields):manager_name::STRING AS manager_name, parse_json(custom_fields):origin::STRING AS origin, parse_json(custom_fields):priority_support_c::STRING AS priority_support_c FROM vaibhav_database.snow_public.my_table'; ELSE RAISE ERROR 'Unsupported schema: %', $schema_var; END IF; EXECUTE IMMEDIATE :sql_stmt; END;
关键说明
- 方式一的优点是无需动态SQL,结果结构稳定,适合报表、ETL等需要固定列结构的场景
- 方式二适合必须严格返回对应schema字段的场景,但需要具备动态SQL执行权限
- 注意
&{schema}变量在Snowflake中是绑定变量,使用时需确保变量替换正确,避免SQL注入风险
内容的提问来源于stack exchange,提问作者vaibhav
相关产品推荐
相关产品推荐

