You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Snowflake中编写CASE语句实现跨Schema JSON字段查询

Snowflake 查询修正方案

你的原查询存在两个核心问题:

  1. CASE 表达式只能返回单个值,无法在一个CASE里同时输出多列,这会导致语法错误
  2. 使用了中文单引号 ‘’,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:52:25