像雪花中的 VARCHAR 列一样解析 JSON

时间:2021-08-01 22:12:05

标签: sql snowflake-cloud-data-platform

我在 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 值,我们将不胜感激!

2 个答案:

答案 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_jsonflatten 执行此操作。请注意,您的 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"
        }
     }
  ]
}')
);