Snowflake 扁平化 json SQL

Snowflake flatten json SQL

提问人:Tyler Moore 提问时间:10/12/2023 最后编辑:Tyler Moore 更新时间:10/13/2023 访问量:51

问:

我有一个保存在文件中的许多产品 ID 的列表。.csv

我需要在 Snowflake 中查询产品 ID,其中每个产品 ID 都位于名为 PRODUCTCODES 的字段中的 JSON 对象中。PRODUCT CODES 中的每个值都包含在一个数组中,因此单个记录和 ROWID 可以有多个产品代码。

例:

[
    { "type": "product_id", "value": "BRB580900062" } 
]

艺术

[
    { "type": "product_id", "value": "BRB580900062" } ,
    { "type": "product_id", "value": "G2G102341235" }
]

我编写了这个脚本来一次提取一个产品ID的记录,如下所示:

select ROWID, PRODUCTCODES, DESCRIPTORS
from PRODUCTTABLE
where PRODUCTCODES like '%BRB580900062%'

但是,这当然一次只有一行 - 我需要脚本来提取文件中所有 100 万个产品 ID 的行。

有没有一个功能可以让我这样做?我目前编写的代码中有什么可以用更好的方式编写的吗?

谢谢!

sql json snowflake-cloud-data-platform where-子句

评论

1赞 Mike Walton 10/12/2023
您能展示一下多个值是如何存储在 JSON 中的吗?您似乎正在尝试将其评估为字符串,如果您将其作为 VARIANT 查询,则无需使用 .每个值是表中的单独行,还是单个记录中的数组中的值?PRODUCTCODESLIKE
0赞 Tyler Moore 10/13/2023
每个值都位于单个记录内的数组中

答:

1赞 ADITYA PAWAR 10/13/2023 #1

您需要使用 flatten 来提取每一行的 productId,然后您可以轻松地对其应用所需的任何筛选器。

以下脚本将为 productId 创建专用列以启用筛选。

如果您正在寻找其他东西,请告诉我。

with PRODUCTTABLE as (
select 1 ROWID,'DESCRIPTORS1' DESCRIPTORS,
parse_json('[
    { "type": "product_id", "value": "BRB580900062" } 
]') PRODUCTCODES
union

select 2 ROWID,'DESCRIPTORS2' DESCRIPTORS,
parse_json('[
    { "type": "product_id", "value": "BRB580900062" } 
    ,{ "type": "product_id", "value": "G2G102341235" } 
]') PRODUCTCODES

)
select rowId,DESCRIPTORS,f.value:"value"::varchar product_id, PRODUCTCODES
from PRODUCTTABLE a
,lateral flatten(a.PRODUCTCODES) f
where product_id in ('BRB580900062');