我在 SQL 数据库中有一个名为 TAG
的 VARCHAR 列,其数据类似于下面的示例。
示例:
{
"list":[
{
"item":{
"id":"aa1212dg3232",
"name":"Joe Doe",
"postScore":9000,
"url":”google.com"
}
},
{
"item":{
"id":"1111jjdjdjsdj11",
"name":"Jane Doe",
"postScore":12222,
"url":"yahoo.com"
}
}
]
}
由于它不是 JSON 列,因此我很难解析该列以获取 postScore 值。
我尝试将其从 VARCHAR
转换为 Variant
数据类型,以便我可以执行以下操作来获取
SELECT d.TAGS['list']['item']['postScore']::string as PostScore
FROM data d;
如果您能帮助我从这个 Varchar 列中获取 postScore 值,我们将不胜感激!
答案 0 :(得分:2)
使用 CTE 作为示例输入:
WITH x AS (
SELECT '{
"list":[
{
"item":{
"id":"aa1212dg3232",
"name":"Joe Doe",
"postScore":9000,
"url":"google.com"
}
},
{
"item":{
"id":"1111jjdjdjsdj11",
"name":"Jane Doe",
"postScore":12222,
"url":"yahoo.com"
}
}
]
}' as str
)
您只需要在将字符串解析为 JSON 后展平数组:
SELECT y.value:item:postScore::varchar
FROM x,
LATERAL FLATTEN(input=>parse_json(str):list) y;
答案 1 :(得分:1)
您可以使用 parse_json
和 flatten
执行此操作。请注意,您的 JSON 有问题。请注意,单词 google
开头的第一个引号字符是一个奇怪的双引号,可能会给您带来问题:"url":”google.com"
- ”
与 "
不同。< /p>
无论如何,假设您的报价是复制粘贴错误,而不是实际 JSON 的问题,那么您可以这样做:
查询
select
value:item:postScore
from test_table,
lateral flatten(input => parse_json(col1):list)
;
我使用的示例表
create or replace transient table test_table as (
select
column1::varchar as col1
from
values ('{
"list":[
{
"item":{
"id":"aa1212dg3232",
"name":"Joe Doe",
"postScore":9000,
"url":"google.com"
}
},
{
"item":{
"id":"1111jjdjdjsdj11",
"name":"Jane Doe",
"postScore":12222,
"url":"yahoo.com"
}
}
]
}')
);