查询 json 来自 oracle 12.1 的数据,其字段值带有“.”

query json data from oracle 12.1 having fields value with "."

我有一个 table 存储了 JSON 数据,我在查询中使用了 json_exists 函数。下面是我在其中一行的列中的示例数据。

{"fields":["query.metrics.metric1.field1",
           "query.metrics.metric1.field2",
           "query.metrics.metric1.field3",
           "query.metrics.metric2.field1",
           "query.metrics.metric2.field2"]}

我想要所有具有特定字段的行。所以,我在下面尝试。

SELECT COUNT(*) 
  FROM my_table 
 WHERE JSON_EXISTS(fields, '$.fields[*]."query.metrics.metric1.field1"');

它没有给我任何结果。不知道我在这里错过了什么。请帮忙。

谢谢

我不知道如何在数组元素上进行“模式匹配”,但只需解析整个内容并进行过滤即可。

with t(x, json) as (
  select 1, q'|{"fields":["a", "b"]}|' from dual union all
  select 2, q'|{"fields":["query.metrics.metric1.field1","query.metrics.metric1.field2","query.metrics.metric1.field3","query.metrics.metric2.field1","query.metrics.metric2.field2"]}|' from dual
)
select t.*
from t
where exists (
  select null
  from json_table(
    t.json,
    '$.fields[*]'
    columns (
      array_element varchar2(100) path '$'
    )
  )
  where array_element = 'query.metrics.metric1.field1'
);

在您的代码中,您正在访问 fields 数组中对象的字段 "query.metrics.metric1.field1",但没有该对象(元素是字符串)...

您可以使用 @ 运算符来引用数组 fields 的出现,例如

SELECT *
  FROM my_table    
 WHERE JSON_EXISTS(fields, '$.fields?(@=="query.metrics.metric1.field1")')

Demo

编辑:以上案例适用于12R2+,考虑到它不适用于您的版本(12R1),尝试使用JSON_TABLE() 例如

SELECT fields
  FROM my_table,   
  JSON_TABLE(fields, '$.fields[*]' COLUMNS ( js VARCHAR2(90) PATH '$' )) 
 WHERE js = 'query.metrics.metric1.field1' 

Demo