为啥 json_extract 有效,但 json_extract_scalar 无效?

Posted

技术标签:

【中文标题】为啥 json_extract 有效,但 json_extract_scalar 无效?【英文标题】:Why json_extract works but json_extract_scalar does not?为什么 json_extract 有效,但 json_extract_scalar 无效? 【发布时间】:2020-10-07 21:56:21 【问题描述】:

我有一个数据集,其中包含 json 中的一个列,其中一个属性给了我一个列表,我想将其取消嵌套以加入一些不同的数据。

我想到了json_extract_scalar json_data,然后我可以split 它,最后unnest 进行其他操作,但是我遇到了问题。

在我的情况下,当我运行 json_extract 时它工作正常,但我无法转换为 varchar。另一方面,如果我使用json_extract_scalar,它会返回一个空值。

我认为问题应该是引号,但我不确定如何处理它——即使这是正确的问题。

让我给你一个数据样本:

"my_test_list":["756596263-0","743349523-371296","756112380-0","755061590-0"]

你们能给我一些建议吗?

我正在 Presto 中查询 SQL。

【问题讨论】:

【参考方案1】:

您在键 my_test_list 下存储的是 JSON 数组,而不是标量值 - 这就是 json_extract_scalar() 返回 null 的原因。

目前还不清楚您想如何使用这些数据。一个典型的解决方案是将cast 转换为array,然后您可以根据需要使用它,例如取消嵌套。基本语法是:

cast(json_extract(mycol, '$.my_test_list') as array(varchar))

然后您将在横向连接中使用它,例如:

select t.mycol, x.myval
from mytable t
cross join unnest(
    cast(json_extract(mycol, '$.my_test_list') as array(varchar))
) as x(myval)

【讨论】:

GMB,我数据集中的每一行都有一行这样的列表。我的想法是计算列表中的每个元素。所以项目“A”可以出现在跨行的几个列表中,我想计算一下。我不确定我是否按照自己的意愿表达清楚,但无论如何我感谢您的帮助 @DanielMiranda:所以:select x.myval, count(*) cnt from mytable t cross join unnest( cast(json_extract(mycol, '$.my_test_list') as array<varchar>) ) as x(myval) group by x.myval 完美!它工作得很好,我可以做手术!谢谢,专线小巴!

以上是关于为啥 json_extract 有效,但 json_extract_scalar 无效?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL LIKE 与 json_extract

BigQuery 中 JSON_EXTRACT 和 JSON_QUERY 的区别

BigQuery 标准 SQL 中的 JSON_EXTRACT?

JSON_EXTRACT 不适用于 BigQuery 中的布尔值

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

mysql中json_extract函数的使用?作用是什么?