【问题标题】:BigQuery - JSON_EXTRACT only extracts first entryBigQuery - JSON_EXTRACT 仅提取第一个条目
【发布时间】:2020-06-22 13:42:59
【问题描述】:

我有一列包含如下的 json 字符串:

[{"answer":"europe-austria-swiss","text":"Österreich, Schweiz"},{"answer":"europe-italy","text":"Italien"},{"answer":"europe-france","text":"Frankreich"}]

我想提取 ONE 列和行中给出的所有答案,用逗号分隔:

europe-austria-swiss, europe-italy, europe-france

我想我尝试了 JSON_EXTRACT 和 JSON_EXTRACT_ARRAY 提供的所有可能性或替换括号和其他符号,但我要么只提取第一个条目(在这种情况下

europe-austria-swiss

) 或者它作为数组拆分为行,我不能再从中提取“答案”的字符串。

有人知道如何解决这个问题吗?非常感谢! 这一列当然是一个更大的表格的一部分(如果无论如何相关的话)。

【问题讨论】:

  • 你的数据结构不清楚。你有 JSON 对象数组吗?还是带有数组的 JSON?同时显示你现在使用的代码。
  • 这是一个包含json对象的json数组。

标签: sql json google-bigquery


【解决方案1】:

我想我知道发生了什么(如果我错了,请纠正我)。

我最好的猜测是你正在尝试类似的东西:

SELECT JSON_EXTRACT(json_text, "$.answer") AS answers
FROM UNNEST([
'{"answer":"europe-austria-swiss","text":"Österreich, Schweiz"},{"answer":"europe-italy","text":"Italien"},{"answer":"europe-france","text":"Frankreich"}'
]) as json_text

这会返回:

"europe-austria-swiss"

但是,如果您更改类似这样的基础数据(每行作为一个 json 字符串对象),它应该可以解决问题:

SELECT JSON_EXTRACT(json_text, "$.answer") AS answers
FROM UNNEST([
'{"answer":"europe-austria-swiss","text":"Österreich, Schweiz"}',
'{"answer":"europe-italy","text":"Italien"}',
'{"answer":"europe-france","text":"Frankreich"}'
]) as json_text

结果:

"europe-austria-swiss"
"europe-italy"
"europe-france"

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT (
      SELECT STRING_AGG(JSON_EXTRACT_SCALAR(answer, '$.answer'), ' ,') 
      FROM UNNEST(JSON_EXTRACT_ARRAY(json_string)) answer
      ) AS answers 
    FROM `project.dataset.table`  
    

    您可以使用您问题中的示例数据进行测试,如以下示例所示

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT '[{"answer":"europe-austria-swiss","text":"Österreich, Schweiz"},{"answer":"europe-italy","text":"Italien"},{"answer":"europe-france","text":"Frankreich"}]' json_string
    )
    SELECT (
      SELECT STRING_AGG(JSON_EXTRACT_SCALAR(answer, '$.answer'), ' ,') 
      FROM UNNEST(JSON_EXTRACT_ARRAY(json_string)) answer
      ) AS answers 
    FROM `project.dataset.table`   
    

    结果

    Row answers
    1   europe-austria-swiss ,europe-italy ,europe-france
    

    【讨论】:

      猜你喜欢
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      相关资源
      最近更新 更多