如何从雪花场 PARSE_JSON?

时间:2021-03-19 17:32:17

标签: sql arrays snowflake-cloud-data-platform

我有一个看起来像这样的表格:

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'] != ''
)

2 个答案:

答案 0 :(得分:1)

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

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

我建议添加 DISTINCT 以防止输出中出现重复标签:

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 <> '';

答案 1 :(得分:0)