从JSON中提取所有值

k2fxgqgv  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(136)

我有一些数据看起来像这样:

| 来自其他列的数据|JSON数据|
| --|--|
| 数据1| JSON 1|
| 数据2| JSON 2|

JSON数据如下所示:

{
    "status": "x"
    ,"campaigns": [
        {"channel": "channel_1", "name": "sample_1"}
        ,{"channel": "channel_2", "name": "sample2"}
        ,{"channel": "channel_3", "name": "sample_3"}
    ]
 }

字符串

**我需要创建一个查询,为每个渠道提供1行。**使用JSON_QUERY()仅在活动只有1个渠道时提供输出。在上面的示例中,JSON_QUERY()将失败,因为活动中有3个渠道。

SELECT
    normal_data
    ,json_array
    ,json_query(
        json_array
        ,'lax $.campaigns.channel'
     ) AS test
FROM test


然而,这只会得到只有一个通道的示例,否则会产生错误。我需要得到通道和名称的每个示例。

我的预期输出为:

| 其他列的正态数据|信道|名称|
| --|--|--|
| 数据_1| channel_1|样品_1|
| 数据_1|通道_2|样品_2|
| 数据_1| channel_3|样品_3|
| 数据_2| channel_1|样品_1|
| 数据_2|通道_2|样品_2|
| 数据_2|通道_2|样品_3|
感谢您的帮助!

abithluo

abithluo1#

就我个人而言,我只会使用json_extract函数进行一些转换(到数组)和取消嵌套。例如:

-- sample data
with dataset (json_col) as (values ('{
    "status": "x","campaigns": [
        {"channel": "channel_1", "name": "sample_1"}
        ,{"channel": "channel_2", "name": "sample2"}
        ,{"channel": "channel_3", "name": "sample_3"}
    ]
 }'))

-- query
select m['channel'] channel,
       m['name']    name
from dataset
, unnest(
    -- or array(map(varchar, json))
    cast(json_extract(json_parse(json_col), '$.campaigns') as array(map(varchar, varchar))) 
  ) as t(m);

字符串
输出量:
| 信道|名称|
| --|--|
| channel_1|样品_1|
| 通道_2| sample2|
| channel_3|样品_3|

相关问题