sql: JSON_QUERY() 函数提取对象

Posted

技术标签:

【中文标题】sql: JSON_QUERY() 函数提取对象【英文标题】:sql: JSON_QUERY() function to extract objects 【发布时间】:2021-08-31 16:50:05 【问题描述】:

我的数据集中有一个字段,其中包含以下格式的 json 对象:

cars
["element":"name":"honda","id":"34"]
["element":"name":"Lexus","id":"56"]

我正在使用以下查询来提取汽车的名称,但只返回空 (null) 行。任何想法我做错了什么?

select JSON_QUERY(cars,"$.name") AS car_names
from myTable
limit 100

【问题讨论】:

汽车的实际数据类型是什么,数组还是字符串?数组:['"element":"name":"honda","id":"34"'] 字符串:'["element":"name":"Lexus","id" :"56"]' 【参考方案1】:

考虑以下方法

select *, 
  ( select string_agg(json_extract_scalar(car, '$.element.name')) 
    from unnest(json_extract_array(cars)) car
  ) car_names
from `project.dataset.table`    

如果应用于您问题中的示例数据 - 如下例所示

with `project.dataset.table` as (
  select '["element":"name":"honda","id":"34"]' cars union all
  select '["element":"name":"Lexus","id":"56"]'
)
select *, 
  ( select string_agg(json_extract_scalar(car, '$.element.name')) 
    from unnest(json_extract_array(cars)) car
  ) car_names
from `project.dataset.table`    

输出是

【讨论】:

【参考方案2】:

如果你想提取一个标量值,你应该简单地使用 JSON_VALUE(expression,path)

For Example:

Info 对象包含一个变量名另一个对象地址, 您可以使用 JSON_VALUE 获取 name 的值,因为它不是对象

但是

要获取地址,你必须使用JSON_QUERY.

【讨论】:

以上是关于sql: JSON_QUERY() 函数提取对象的主要内容,如果未能解决你的问题,请参考以下文章

求一个数据库函数解析json 如下图要求

json_query查询到的Ansible事实如何除法?

BigQuery 中 JSON_EXTRACT 和 JSON_QUERY 的区别

使用 Json_Query 连接数组值

使用Ansible中的json_query / jmespath过滤器进行多次搜索

SQL-SQL函数Scalar 函数