【问题标题】:Bigquery: Is there a json path way to extract only values ​from a json array with dynamic keys?Bigquery:是否有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?
【发布时间】:2021-11-01 09:01:04
【问题描述】:

规格如下。

  • 字段值为json数组。
  • 每个 json 元素都有一个动态键。
  • 提取数组的所有值

[示例]

WITH TempTable AS
 (SELECT '1' as id, '[{"1_03":8},{"1_04":8}]' as target  UNION ALL
  SELECT '2', '[{"1_19":8},{"1_08":9}]' UNION ALL
  SELECT '3', '[{"1_23":4},{"1_24":6}]'
  )
SELECT 
    id,
    json_query_array(target,'$'),
    REGEXP_EXTRACT_ALL(target, '"(.*?)":') as key,
    REGEXP_EXTRACT_ALL(target, ':([0-9]+)') as val
FROM TempTable

对于带有json数组的字段(在示例中),我只能用正则表达式提取值。

但是,有没有办法应用json路径方法?

【问题讨论】:

  • 只提取一个值是什么意思?在您的示例中,您似乎正在提取数组的所有值。
  • @DanielZagales 你说的是对的。文本内容已明确修改。 (提取数组的所有值)

标签: arrays json google-bigquery


【解决方案1】:

考虑以下方法

SELECT id, element,
  kv[OFFSET(0)] as key,
  kv[OFFSET(1)] as value
FROM TempTable, 
UNNEST(JSON_EXTRACT_ARRAY(target)) element,
UNNEST([STRUCT(SPLIT(TRANSLATE(element, '{}"', ''), ':') as kv)])     

如果应用于您问题中的样本数据 - 输出是

如果您想保留行 - 请使用以下版本

SELECT id, ARRAY( 
    SELECT AS STRUCT
      element,
      kv[OFFSET(0)] as key,
      kv[OFFSET(1)] as value,    
    FROM UNNEST(JSON_EXTRACT_ARRAY(target)) element,
    UNNEST([STRUCT(SPLIT(TRANSLATE(element, '{}"', ''), ':') as kv)]) 
  ) AS output
FROM TempTable

在这种情况下 - 输出是

【讨论】:

  • 非常有帮助。我很感激。
猜你喜欢
  • 2016-04-17
  • 2019-10-20
  • 1970-01-01
  • 2022-09-23
  • 2023-01-22
  • 2021-03-10
  • 2019-12-09
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多