BigQuery - JSON_EXTRACT 仅提取第一个条目

Posted

技术标签:

【中文标题】BigQuery - JSON_EXTRACT 仅提取第一个条目【英文标题】:BigQuery - JSON_EXTRACT only extracts first entry 【发布时间】: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数组。 【参考方案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

【讨论】:

以上是关于BigQuery - JSON_EXTRACT 仅提取第一个条目的主要内容,如果未能解决你的问题,请参考以下文章

JSON_EXTRACT 不适用于 BigQuery 中的布尔值

BigQuery 中 JSON_EXTRACT 和 JSON_QUERY 的区别

避免 BigQuery 中 JSON_EXTRACT 函数中的指数表示法

将使用 JSON_EXTRACT 的查询从 MySQL 转换为 BigQuery

我想用 BigQuery 提取 Json 格式的数据。 UDF 或 json_extract

如何使用 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR 在 Big Query 中读取多级 JSON 数据