簡體   English   中英

從BigQuery中的JSON中的數組中提取多個值

[英]Extract multiple values from an array in JSON in BigQuery

我的數據庫表中有一個 JSON,如下所示,假設該列包含一個名為 favorites 的 JSON 文件。

{
    "info": {
        "music": [{"Year":2021,"Name":"Stay","Singer":"Justin Bieber"},
                  {"Year":2015,"Name":"Love Yourself","Singer":"Justin Bieber"},
                  {"Year":2003,"Name":"Crazy In Love","Singer":"Beyonce"}
                 ],
        "movie": [{"Year":2018,"Name":"Green Book","Director":"Peter Farrelly"},
                  {"Year":2007,"Name":"Lust, Caution","Director":"Ang Lee"}
                 ]
             }
}

I wanted to select all values from tags and my expected table would be like as following:

-----------------------------------------------------------------------------
|             Name                    |                      Singer         |
----------------------------------------------------------------------------
|   Stay,Love Yourself,Crazy In Love  |  Justin Bieber,Justin Bieber,Beyonce|
-----------------------------------------------------------------------------

我已經知道如何使用 JSON_QUERY(json_col,'$.info.music[0].Name') 獲取數組中的第一個值,但我想將所有名稱或歌手提取到一個列中,還有一些 arrays可能有多個項目。 有人有什么建議嗎?

考慮以下方法

select 
  array(select json_extract_scalar(x, '$.Name') from unnest(json_extract_array(json_col, '$.info.music') || json_extract_array(json_col, '$.info.movie')) x) Name,
  array(select json_extract_scalar(x, '$.Singer') from unnest(json_extract_array(json_col, '$.info.music')) x) Singer
from data      

如果應用於您問題中的樣本數據 - output 是

在此處輸入圖像描述

我剛剛意識到 - 你想要逗號分隔列表 - 那么請考慮下面

select 
  (select string_agg(json_extract_scalar(x, '$.Name')) from unnest(json_extract_array(json_col, '$.info.music') || json_extract_array(json_col, '$.info.movie')) x) Name,
  (select string_agg(json_extract_scalar(x, '$.Singer')) from unnest(json_extract_array(json_col, '$.info.music')) x) Singer
from data     

與 output

在此處輸入圖像描述

另一個溶膠。 如果您不想聚合,可以使用 ARRAY_TO_STRING。

with data as
(
select
    """
    {
"info": {
        "music": [{"Year":2021,"Name":"Stay","Singer":"Justin Bieber"},
                  {"Year":2015,"Name":"Love Yourself","Singer":"Justin Bieber"},
                  {"Year":2003,"Name":"Crazy In Love","Singer":"Beyonce"}
                 ],
        "movie": [{"Year":2018,"Name":"Green Book","Director":"Peter Farrelly"},
                  {"Year":2007,"Name":"Lust, Caution","Director":"Ang Lee"}
                 ]
             }
}
""" as _json
)

select array_to_string(
    array(
    select  json_extract_scalar(x,"$.Name")
    from  data,  
          unnest(json_extract_array(_json,"$.info.music")) as x
),"," 
) as Name, array_to_string(
    array(
      select  json_extract_scalar(x,"$.Singer")
    from  data,  
        unnest(json_extract_array(_json,"$.info.music")) as x
),","
) as Singer

結果在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM