sql - 在 Presto 中从 JSON 数组中提取值

标签 sql arrays json presto trino

我有一列包含 JSON 数组,如下所示:

{data=[{"name":"col1","min":0,"max":32,"avg":29},
{"name":"col2","min":1,"max":35,"avg":21},
{"name":"col3","min":4,"max":56,"avg":34}]}
我正在尝试解析数组并根据条件提取特定值。例如"min" 的值哪里"name"="col1" : 0"avg" 的值哪里"name"="col3" : 34
有没有人有解决方案?

最佳答案

您的 JSON 无效。应该是 {"data":[不是 {data = [如果 JSON 有效(您可以在子查询中轻松修复它),提取数据,将其转换为数组(行)并使用 CASE 表达式获取值。我在这里添加了 max() 聚合以删除 NULL 记录并在单行中获取所有必需的值,您可以改用过滤器(例如 where x.name = 'col1' ),具体取决于您的需要:

with mydata as (
select '{"data":[{"name":"col1","min":0,"max":32,"avg":29},
{"name":"col2","min":1,"max":35,"avg":21},
{"name":"col3","min":4,"max":56,"avg":34}]}' json
)

select max(case when x.name = 'col1' then x.min end) min_col1,
       max(case when x.name = 'col3' then x.avg end) avg_col3
from mydata
CROSS JOIN
    UNNEST(
            CAST(
                JSON_EXTRACT(json,'$.data')
                    as ARRAY(ROW(name VARCHAR, min INTEGER, max INTEGER, avg INTEGER))
                 )
          ) as x(name, min, max, avg) --column aliases
结果:
min_col1    avg_col3
0           34

关于sql - 在 Presto 中从 JSON 数组中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66015729/

相关文章:

javascript - 如何在javascript中更改数组中的元素并将其存储在新数组中

json - 将 JSON 数据从 dynamoDB 复制到 redshift

javascript - 检查变量/键是否存在

php - 我的 php 不解释 postgresql 或 sql 函数

php - 服务器中的图像未出现在 WordPress 媒体库中

mysql - 我需要从连接的表中获取所有记录,其中至少有一个有条件的情况

javascript - 如何重构数组上的 .filter 方法以便传递过滤所需的另一个变量?

mysql - 无论列顺序如何,都显示不同的元组

c - 为什么 m[1] - m[0] 返回 3,其中 m 是一个 3x3 矩阵?

php - 在 Get_Where 查询中匹配 JSON 字段(Code Igniter)