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

Snowflake提取字符串包裹的嵌套JSON所有值的实现求助

解决Snowflake中嵌套JSON字符串的结构化转换问题

原始JSON数据

[  
  {    
    "A": "[{\"A\":\"5854\"}]"  
  },  
  {    
    "B": "[{\"B\":\"5681\"}]"  
  },  
  {    
    "FYM": "[{\"200701\":\"202112\",\"\":\"177\"}]"  
  }
]

需求说明

需将上述数据转换为包含COL_NAME、VALUE、MIN_DT、MAX_DT的结构化表格:

  • COL_NAME:对应原始JSON中的顶级键(A、B、FYM)
  • VALUE:对应嵌套JSON中的业务值(5854、5681、177)
  • MIN_DT/MAX_DT:仅针对FYM字段,分别取嵌套JSON中的日期范围键(200701)和对应值(202112),其他字段这两列为NULL

实现SQL

WITH raw_data AS (
  SELECT PARSE_JSON('[{"A":"[{\"A\":\"5854\"}]"},{"B":"[{\"B\":\"5681\"}]"},{"FYM":"[{\"200701\":\"202112\",\"\":\"177\"}]"}]') AS json_data
),
flattened_top AS (
  SELECT 
    f.value AS top_obj
  FROM raw_data,
       LATERAL FLATTEN(input => json_data) f
),
extract_top_keys AS (
  SELECT 
    OBJECT_KEYS(top_obj)[0] AS col_name,
    PARSE_JSON(top_obj[OBJECT_KEYS(top_obj)[0]]) AS nested_json
  FROM flattened_top
),
final_parse AS (
  SELECT
    col_name,
    -- 提取VALUE字段,按不同列名匹配取值
    CASE 
      WHEN col_name IN ('A', 'B') THEN nested_json[0][col_name]::STRING
      WHEN col_name = 'FYM' THEN nested_json[0]['']::STRING
    END AS value,
    -- 仅FYM字段提取MIN_DT
    CASE 
      WHEN col_name = 'FYM' THEN OBJECT_KEYS(nested_json[0])[0]::STRING
      ELSE NULL
    END AS min_dt,
    -- 仅FYM字段提取MAX_DT
    CASE 
      WHEN col_name = 'FYM' THEN nested_json[0][OBJECT_KEYS(nested_json[0])[0]]::STRING
      ELSE NULL
    END AS max_dt
  FROM extract_top_keys
)
SELECT * FROM final_parse;

预期结果

COL_NAMEVALUEMIN_DTMAX_DT
A5854NULLNULL
B5681NULLNULL
FYM177200701202112

内容的提问来源于stack exchange,提问作者Naveen Srikanth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:20:36