Snowflake cloud data platform 在Snowflake中提取variant/json数据
我有一个列,比如variant_列,它的数据看起来与此完全相同(这将是一行数据):Snowflake cloud data platform 在Snowflake中提取variant/json数据,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我有一个列,比如variant_列,它的数据看起来与此完全相同(这将是一行数据): [ { “键”:“列名称1”, “值”:“值在这里” }, { “密钥”:“元数据”, “值”:“{这里可能是另一个巨大的json}” }, { “键”:“列名称2”, “值”:“值在这里再次出现” }, { “键”:“列名称3”, “价值”:“价值在这里继续” } ]虽然不是理想的JSON结构,但您仍然可以将其展平,使用一些case语句,然后再次将其聚合在一起。试着这样做: WITH x AS ( SELEC
[
{
“键”:“列名称1”,
“值”:“值在这里”
},
{
“密钥”:“元数据”,
“值”:“{这里可能是另一个巨大的json}”
},
{
“键”:“列名称2”,
“值”:“值在这里再次出现”
},
{
“键”:“列名称3”,
“价值”:“价值在这里继续”
}
]
虽然不是理想的JSON结构,但您仍然可以将其展平,使用一些case语句,然后再次将其聚合在一起。试着这样做:
WITH x AS (
SELECT parse_json('[
{
"key": "column_name_1",
"value": "value_goes_here"
},
{
"key": "metadata",
"value": "{this_could_be_another_huge_json_here}"
},
{
"key": "column_name_2",
"value": "value_goes_here_again"
},
{
"key": "column_name_3",
"value": "value_goes_here_yet_again"
}
]') as var
)
SELECT f.seq,
MAX(CASE WHEN f.value:key::varchar = 'column_name_1' THEN f.value:value::varchar END) as column_name_1,
MAX(CASE WHEN f.value:key::varchar = 'column_name_2' THEN f.value:value::varchar END) as column_name_2,
MAX(CASE WHEN f.value:key::varchar = 'column_name_3' THEN f.value:value::varchar END) as column_name_3,
MAX(CASE WHEN f.value:key::varchar = 'metadata' THEN f.value:value::variant END) as metadata
FROM x,
LATERAL FLATTEN(input=>var) f
GROUP BY f.seq
;
谢谢,这个很好用。此时我遇到的另一个问题是
元数据
列。该数据中有反斜杠(例如,“product\u type\”:“ALL\”)。当我在此列中使用REPLACE()
删除反斜杠时,它会将其转换回字符串。但是,当我尝试将删除反斜杠的“替换”字符串转换回变体时,它会再次添加反斜杠!我需要能够与这个元数据列进行交互,就像它是一个变体一样,但是添加的反斜杠使这变得不可能。最初,我将元数据转换为一个变量(正如您在解决我的问题时添加的::variant
),但是如果您将\“
替换为”,然后执行
PARSE_JSON(…)`而不是强制转换为变量,它将正确完成任务。