我在presto中解析一个json,并在它上面应用正则表达式.

{"value":"{\"123\":{\"type\":\"TAGGING\",\"role\":\"RESULT\",\"payload\":[{\"values\":{\"qbc\":\"not-abc\",\"def\":\"yes\",\"ghi\":\"gh\"}}]}}"}

Regexp used :
REGEXP_EXTRACT(JSON_EXTRACT_SCALAR(
        Opfields,
        '$.value'
    ),
    '.*"abc":(.*?),',
    1
) abc

现在这对abc有效,因为abc值后有一个逗号,但对ghi不起作用.对于ghi,我知道在本例中,我可以在本例中使用}.但问题是,这些定标器值(如abc、ghi)可能以不同的顺序出现,在这种情况下,它可能以逗号或}结尾.

我正在寻找一种在任何情况下都可以工作的表达式,无论顺序是什么.从本质上讲,我需要abc、def和ghi的值,无论它们在json中的出现顺序如何.

有人能建议一下做这件事的好方法吗?

我已经提到了我try 过的regexp

推荐答案

您不需要在这里使用正则表达式,根据显示的数据,您在这里似乎只有一个双重编码的JSON(即value包含一个JSON字符串,其中包含一个编码的JSON),所以您可以再次解析它并将其作为JSON处理.使用Presto(由于其有限的JSON路径支持),涉及到映射和数组的一些强制转换会有些麻烦:

-- sample data
with dataset(opfields) as(
    values ('{"value":"{\"123\":{\"type\":\"TAGGING\",\"role\":\"RESULT\",\"payload\":[{\"values\":{\"abc\":\"not-abc\",\"def\":\"yes\",\"ghi\":\"gh\"}}]}}"}')
)

-- query
select JSON_EXTRACT(js1, '$.values.abc') abc,
       JSON_EXTRACT(js1, '$.values.ghi') ghi
from dataset,
    unnest (cast(JSON_PARSE(JSON_EXTRACT_SCALAR(opfields, '$.value')) as map(varchar, json))) as t(k, js),
    unnest (cast(JSON_EXTRACT(js, '$.payload') as array(json))) as t1(js1);

输出:

   Abc   | ghi
-----------------+-----------
 "not-abc" | "gh"

如果您实际使用的是Trino,则可以使用json_query:

select json_query(JSON_EXTRACT_SCALAR(opfields, '$.value'), 'strict $.*.payload[*].values.abc' WITHOUT ARRAY WRAPPER) sensitivity,
       json_query(JSON_EXTRACT_SCALAR(opfields, '$.value'), 'strict $.*.payload[*].values.ghi' WITHOUT ARRAY WRAPPER) certainty
from dataset;

Sql相关问答推荐

GROUP BY和GROUP_CONCAT用于计算比赛排名

用相同值更新行

如何在联接条件不匹配时按日期获取上一条记录

数据库索引:如何使用名称和类别对项目进行最佳索引?

解析SQL Server中的嵌套JSON

Oracle SQL根据列中的条件 Select 最大记录数

为什么TRY_CONVERT返回一个XML验证错误而不是NULL?

使用DatePart函数对日期时间值进行分组

将Dense_RANK列为聚合(非解析)函数(&A)

重用传递给 node 的参数-postgres upsert查询

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

在SELECT中将日期格式转换为双周时段

postgres中的条件索引和触发器

从JSON值数组创建扁平数组Athena

如何解决错误;ORA-00911:无效字符;在果朗?

如何在 SQL Server 中解决这个复杂的窗口查询?

在没有订单的情况下,如何生成一个值为0的顾客天数行

达到特定值时,从0开始累加求和

在 postgresql 中保存带有时间戳的几何类型数据

snowfalke 会在 Select 运行时锁定表吗?