繁体   English   中英

如何从雪花场解析 JSON?

[英]How to PARSE_JSON from Snowflake Field?

我有一个看起来像的表:

ID|FIELD1
1|[ { "list": [ {} ] } ]
2|[ { "list": [ { "item": "" } ] } ]
3|[ { "list": [ { "item": "Tag1" }, { "item": "Tag2" } ] } ]

我想获取与这个特定查询相关的所有标签,这样我就可以得到一个列表:

Tag1,Tag2

我试过了

SELECT PARSE_JSON(FIELD1[0]['list'][0]['item']) FROM MY_TABLE
WHERE PARSE_JSON(FIELD1[0]['list'][0]) != '{}'

但我明白了

JSON: garbage in the numeric literal: 65-310 , pos 7

如何正确解压缩 SQL 中的这些值?

更新:笨拙的解决方案

SELECT LISTAGG(CODES,'\',\'') AS PROMO_CODES
FROM
(SELECT DISTINCT FIELD1[0]['list'][0]['item'] AS CODES FROM MY_TABLE
WHERE FIELD1[0]['list'][0] IS NOT NULL
AND FIELD1[0]['list'][0] != '{}'
AND FIELD1[0]['list'][0]['item'] != ''
)

如我所见,笨拙的解决方案没有提供正确的结果。 它仅显示 Tag1。 所以这是我的解决方案:

select LISTAGG( v.VALUE:item, ',' ) from MY_TABLE,
lateral flatten (parse_json(FIELD1[0]):list) v
WHERE v.VALUE:item <> '';

我建议添加 DISTINCT 以防止 output 中的重复标签:

select LISTAGG( DISTINCT v.VALUE:item, ',' ) from MY_TABLE,
lateral flatten (parse_json(FIELD1[0]):list) v
WHERE v.VALUE:item <> '';

如果 FIELD1 数组中有更多项(即 0,1,2),您可以使用这个:

select LISTAGG( DISTINCT v.VALUE:item, ',' ) from MY_TABLE,
lateral flatten(FIELD1) f,
lateral flatten (parse_json(f.VALUE):list) v
WHERE v.VALUE:item <> '';

如果这对您的情况有帮助,请查看以下知识文章:

https://community.snowflake.com/s/article/Dynamically-extracting-JSON-using-LATERAL-FLATTEN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM