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

Snowflake嵌套JSON字段解析问题求助

问题:Snowflake解析嵌套JSON时ID和SOURCE字段返回NULL

刚接触Snowflake,尝试解析表中attributes列的嵌套JSON并提取属性,但多次尝试后ID和SOURCE字段始终返回null,STATUS字段正常。

attributes列JSON结构

{
    "Status": [
        "ACTIVE"
    ],
    "Coverence": [
        {
            "Sub": [
                {
                    "EndDate": [
                        "2020-06-22"
                    ],
                    "Source": [
                        "Test"
                    ],
                    "Id": [
                        "CovId1"
                    ],
                    "Type": [
                        "CovType1"
                    ],
                    "StartDate": [
                        "2019-06-22"
                    ],
                    "Status": [
                        "ACTIVE"
                    ]
                }
            ]
        }
    ]
}

第一次尝试的SQL

SELECT DISTINCT *
    from
        (
            TRIM(mt."attributes":Status, '[""]')::string as STATUS,
            TRIM(r.value:"Sub"."Id", '[""]')::string as ID,
            TRIM(r.value:"Sub"."Source", '[""]')::string as SOURCE
            from "myTable" mt,
            lateral flatten ( input => mt."attributes":"Coverence", outer => true) r
        )
    GROUP BY
        STATUS,
        ID,
        SOURCE;

第二次尝试的SQL

SELECT DISTINCT *
    from
        (
            TRIM(mt."attributes":Status, '[""]')::string as STATUS,
            TRIM(r.value:"Id", '[""]')::string as ID,
            TRIM(r.value:"Source", '[""]')::string as SOURCE
            from "myTable" mt,
            lateral flatten ( input => mt."attributes":"Coverence":"Sub", outer => true) r
        )
    GROUP BY
        STATUS,
        ID,
        SOURCE;

问题排查与解决

问题根源

  1. 第一次SQL:仅对Coverence数组做flatten,r.value是包含Sub数组的对象,直接用r.value:"Sub"."Id"无法访问——因为Sub本身是数组,需要再次flatten才能获取内部对象。
  2. 第二次SQL:试图直接flatten Coverence":"Sub,但Coverence是数组,不能直接通过mt."attributes":"Coverence":"Sub"定位到Sub数组,必须先flatten Coverence。
  3. 用TRIM去除[""]的方式不够可靠,Snowflake有更直接的数组元素提取方法。

正确SQL示例

SELECT DISTINCT
    mt."attributes":Status[0]::string AS STATUS,
    sub_item.value:Id[0]::string AS ID,
    sub_item.value:Source[0]::string AS SOURCE
FROM "myTable" mt
LEFT JOIN LATERAL FLATTEN(input => mt."attributes":Coverence) cov_item
LEFT JOIN LATERAL FLATTEN(input => cov_item.value:Sub) sub_item
GROUP BY STATUS, ID, SOURCE;

关键说明

  • 分两次flatten:先处理外层的Coverence数组,再处理每个Coverence对象内的Sub数组,逐层拿到目标对象;
  • 用[0]直接提取数组第一个元素(你的JSON中每个字段都是单元素数组),比TRIM更稳定;
  • 使用LEFT JOIN LATERAL FLATTEN替代隐式逗号连接,逻辑更清晰,也能保留无Coverence数据的行(按需选择)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:45:34