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

在Snowflake中用递归扁平化提取嵌套JSON的CLIENT_FID值

优雅提取嵌套JSON中指定target的values数组(Snowflake实现)

示例JSON

{
  "rules": [
    {
      "target": "USER_ID",
      "values": ["123", "456"]
    },
    {
      "target": "GROUP",
      "rules": [
        {
          "target": "CLIENT_FID",
          "values": ["fid_001", "fid_002"]
        },
        {
          "target": "ROLE",
          "values": ["admin"]
        }
      ]
    },
    {
      "rules": [
        {
          "rules": [
            {
              "target": "CLIENT_FID",
              "values": ["fid_003"]
            }
          ]
        }
      ]
    }
  ]
}

现有繁琐SQL示例

WITH flattened AS (
  SELECT 
    value::JSON AS rule_obj
  FROM 
    your_table,
    LATERAL FLATTEN(input => your_json_column, recursive => TRUE)
  WHERE 
    value::JSON:target IS NOT NULL
)
SELECT 
  ARRAY_CAT_AGG(rule_obj:values) AS client_fid_values
FROM 
  flattened
WHERE 
  rule_obj:target = 'CLIENT_FID';

优化方案

方案1:用JSON_PATH_QUERY_ARRAY直接定位

Snowflake支持JSON路径表达式,通过递归路径遍历所有嵌套的rules节点,结合过滤条件直接提取目标values数组,无需展开全量数据:

SELECT 
  JSON_PATH_QUERY_ARRAY(your_json_column, '$..rules[*]?(@.target == "CLIENT_FID").values') AS client_fid_values
FROM 
  your_table;
  • 路径说明:
    • $..rules[*]:递归匹配所有层级下的rules数组元素
    • ?(@.target == "CLIENT_FID"):过滤target等于CLIENT_FID的节点
    • .values:提取匹配节点的values数组

方案2:简化递归Flatten逻辑

如果偏好使用Flatten,可以直接在Flatten后过滤聚合,省去多余CTE:

SELECT 
  ARRAY_CAT_AGG(value:values) AS client_fid_values
FROM 
  your_table,
  LATERAL FLATTEN(input => your_json_column, recursive => TRUE)
WHERE 
  value:target = 'CLIENT_FID'
  AND value:values IS NOT NULL;

预期输出

两种方案均会返回合并后的目标数组:

["fid_001", "fid_002", "fid_003"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:55:19