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;
问题排查与解决
问题根源
- 第一次SQL:仅对
Coverence数组做flatten,r.value是包含Sub数组的对象,直接用r.value:"Sub"."Id"无法访问——因为Sub本身是数组,需要再次flatten才能获取内部对象。 - 第二次SQL:试图直接
flattenCoverence":"Sub,但Coverence是数组,不能直接通过mt."attributes":"Coverence":"Sub"定位到Sub数组,必须先flattenCoverence。 - 用
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
相关产品推荐
相关产品推荐

