我正在使用 Snowflake 并将 json 文件从 Staging 环境加载到 ODS 环境。
json 数据的结构如下:
{"address": "921 Pearl St",
"attributes": {
"Alcohol": "'beer_and_wine'",
"Ambience": "{'touristy': False, 'hipster': False, 'romantic': False, 'divey': False, 'intimate': False, 'trendy': False, 'upscale': False, 'classy': False, 'casual': True}",
"BikeParking": "True",
"BusinessAcceptsBitcoin": "False",
"BusinessAcceptsCreditCards": "True",
"BusinessParking": "{'garage': False, 'street': True, 'validated': False, 'lot': False, 'valet': False}"
}
现在我正在尝试像这样在 Snowflake 中查询我的数据:
SELECT json_data:attributes.BusinessParking.garage
FROM my_json_table;
但我得到的只是空值。 知道如何到达“BusinessParking”字段的底层吗?
谢谢!!!
答案 0 :(得分:0)
尝试在我得到的在线工具中解析 JSON:
Error: Parse error on line 9:
..., 'valet': False}"}
----------------------^
Expecting '}', ',', got 'EOF'
您可以通过运行 TRY_PARSE_JSON 来检查它是否正确:
SELECT TRY_PARSE_JSON(json_data) from my_json_table
答案 1 :(得分:0)
首先,您的对象缺少结束 }
因此,如果我将“JSON”重写为有效,则您使用的选择表单有效:
select parse_json('{
"address": "921 Pearl St",
"attributes": {
"Alcohol": "beer_and_wine",
"Ambience": {
"touristy": False,
"hipster": False,
"romantic": False,
"divey": False,
"intimate": False,
"trendy": False,
"upscale": False,
"classy": False,
"casual": True
},
"BikeParking": True,
"BusinessAcceptsBitcoin": "False",
"BusinessAcceptsCreditCards": "True",
"BusinessParking": {
"garage": False,
"street": True,
"validated": False,
"lot": False,
"valet": False
}
}
}') as json_data,
json_data:attributes.BusinessParking.garage,
json_data:attributes:BusinessParking:garage
;
但这意味着您的 JSON 无效。
看着你的 Ambience
它是一个字符串化的 JSON 子对象,而不是一个对象,因此它里面嵌入了 '
。因此,在子字符串中转义您的 '`',为了正确解析,我们需要 PARSE_JSON 子对象,因此:
select parse_json('{"address": "921 Pearl St",
"attributes": {
"Alcohol": "\'beer_and_wine\'",
"Ambience": "{\'touristy\': False, \'hipster\': False, \'romantic\': False, \'divey\': False, \'intimate\': False, \'trendy\': False, \'upscale\': False, \'classy\': False, \'casual\': True}",
"BikeParking": "True",
"BusinessAcceptsBitcoin": "False",
"BusinessAcceptsCreditCards": "True",
"BusinessParking": "{\'garage\': False, \'street\': True, \'validated\': False, \'lot\': False, \'valet\': False}"
}}') as json_data,
PARSE_JSON(json_data:attributes.BusinessParking):garage
给出您正在寻找的答案 false
。
编辑
要添加更多详细信息,您的对象具有嵌套的 json 对象,它们是 Stringify'ed
复制上面(和下面)的 SQL 使用转义标记 \
以允许单引号进入数据。但是之后我们可以选择 json_data:attributes.BusinessParking
并查看它的显示方式,就像您在示例中显示的那样,这意味着如果我们在其上使用 PARSE_JSON,我们将再次获得一个有效的 JSON 对象,然后我们可以通过 {{1} 访问它}}
:garage
给出:
答案 2 :(得分:0)
经过大量研究后,我能够以我需要的方式查询字段。 我发现我需要对这些字段使用“try_parse_json”函数,因为它们被定义为字符串而不是实际的 json 对象。
使用该函数后,我可以像这样解析特定字段:
SELECT
TRY_PARSE_JSON(
jsondata: attributes.BusinessParking
): garage AS garage
FROM
"RESTAURANT"."STAGING"."JSON_TABLE_BUSINESS"
Snowflake 的文档不是很好,但它以某种方式解释了您可以做什么:https://docs.snowflake.com/en/sql-reference/functions/try_parse_json.html
这是另一种可以在需要时将字符串值转换为列的方法:https://sqlkover.com/cool-stuff-in-snowflake-part-3-split-and-flatten/
感谢@simeon-pilgrim 的所有评论!