2

我有一个存储 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"');

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

谢谢

4

2 回答 2

2

您可以使用@运算符来引用数组的出现,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

于 2021-03-14T20:02:21.280 回答
1

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

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'
);

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

于 2021-03-14T20:01:28.933 回答