【问题标题】:Extract value from JSON ARRAY in BigQuery从 BigQuery 中的 JSON ARRAY 中提取值
【发布时间】:2021-08-06 22:07:36
【问题描述】:

我正在尝试从 JSON ARRAY 中提取值,如下所示

  with `project.dataset.table` as (
  select '{"fruit":[{"apples":"5","oranges":"10","pear":"20"},
                    {"apples":"5","oranges":"4"},
                    {"apples":"5","oranges":"9","pear":"40"}]}' as json union all
  select '{"fruit":[{"lettuce":"7","kale": "8"}]}' 
)

select json, if(regexp_contains(json, '"apples":"5"'), (SELECT 
ARRAY_AGG(json_extract_scalar(arr, '$.oranges') ignore nulls)
from 
UNNEST(json_extract_ARRAY(json, '$.fruit')) as arr ), null) as oranges,
if(regexp_contains(json, '"apples":"5"'), (SELECT 
ARRAY_AGG(json_extract_scalar(arr, '$.pear') ignore nulls)
from 
UNNEST(json_extract_ARRAY(json, '$.fruit')) as arr ), null) as pear,
from `project.dataset.table` 

输出如下

我期待像这样的输出

json oranges pear
{"fruit":[{"apples":"5","oranges":"10","pear":"20"},{"apples":"5","oranges":"4"},{"apples":"5","oranges":"9","pear":"40"}]} 10 20
4 null
9 40
{"fruit":[{"lettuce":"7","kale": "8"}]}. null null

【问题讨论】:

    标签: json google-cloud-platform google-bigquery


    【解决方案1】:

    考虑下面的方法,更明确地对齐各个条目

    select json, 
      array(
        select 
          if(
            json_extract_scalar(val, '$.apples') = '5',
            struct(
              json_extract_scalar(val, '$.oranges') as oranges,
              json_extract_scalar(val, '$.pear') as pear
            ),
            struct(null, null)
          )
        from t.arr val
      ) fruits
    from `project.dataset.table`, 
    unnest([struct(json_extract_array(json, '$.fruit') as arr)]) t      
    

    它不那么冗长,并且输出水果作为重复记录而不是两个数组
    如果应用于问题输出中的样本数据是

    如果您确实需要将输出保留为单独的列 - 请在下面使用

    select json, 
      array(
        select 
          if(
            json_extract_scalar(val, '$.apples') = '5',
            ifnull(json_extract_scalar(val, '$.oranges'), '0'),
            '0'
          )
        from t.arr val
      ) as oranges,
      array(
        select 
          if(
            json_extract_scalar(val, '$.apples') = '5',
            ifnull(json_extract_scalar(val, '$.pear'), '0'),
            '0'
          )
        from t.arr val
      ) as pear
    from `project.dataset.table`, 
    unnest([struct(json_extract_array(json, '$.fruit') as arr)]) t       
    

    有输出

    【讨论】:

    • 感谢您的帮助 :) 它对我有用!
    【解决方案2】:

    使用array_agg

    如果最终查询结果中的数组包含 NULL 元素。

    您可以尝试像这样使用字符串'null'

    with `project.dataset.table` as (
      select '{"fruit":[{"apples":"5","oranges":"10","pear":"20"},{"apples":"5","oranges":"4"},{"apples":"5","oranges":"9","pear":"40"}]}' as json union all
      select '{"fruit":[{"lettuce":"7","kale": "8"}]}' 
    )
    select 
      json,
      if( regexp_contains(json, '"apples":"5"'),
        (SELECT ARRAY_AGG(ifnull(json_extract_scalar(arr, '$.oranges'), 'null')) from UNNEST(json_extract_ARRAY(json, '$.fruit')) as arr ),
        ['null']
      ) as oranges,
      if( regexp_contains(json, '"apples":"5"'),
        (SELECT ARRAY_AGG(ifnull(json_extract_scalar(arr, '$.pear'), 'null')) from UNNEST(json_extract_ARRAY(json, '$.fruit')) as arr ),
        ['null']
      ) as pear,
    from `project.dataset.table`
    

    【讨论】:

    • 谢谢你的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多