为啥 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 无效?的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery 中 JSON_EXTRACT 和 JSON_QUERY 的区别
BigQuery 标准 SQL 中的 JSON_EXTRACT?
JSON_EXTRACT 不适用于 BigQuery 中的布尔值
如何使用 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR 在 Big Query 中读取多级 JSON 数据