查询只有字符串 oracle 的 json 数组

问题描述

下面是存储在名为“Sample”的表中的json,列名为“argument”。我想获取在指定参数中具有特定值的所有记录。我可以查询参数名称,但不能查询特定值,因为它是一个字符串数组。 (请找到我的钥匙里面有 .)

{
 "arguments":{
    "app.argument1.appId":["123","456"],"app.argument2.testId":["546","567"]
 }
}

这给了我所有具有特定参数的记录。

 select * from sample where json_exists(argument,'$.arguments."app.argument1.appId"');

但我需要匹配参数值。我在下面尝试过,但收到 JSON 表达式错误

select * from sample where json_exists(argument,'$.arguments."app.argument1.appId[*]"?(@ == "123"));

请帮忙。提前致谢。

解决方法

你把引号放错了地方;你想要数组方括号之前的双引号而不是之后:

select *
from   sample
where  json_exists(
         argument,'$.arguments."app.argument1.appId"[*]?(@ == "123")'
       );

对于样本数据:

CREATE TABLE sample ( argument CLOB CHECK ( argument IS JSON ) );

INSERT INTO sample ( argument ) VALUES ( '{
 "arguments":{
    "app.argument1.appId":["123","456"],"app.argument2.testId":["546","567"]
 }
}');

输出:

| ARGUMENT                                                                                                                 |
| :----------------------------------------------------------------------------------------------------------------------- |
| {<br> "arguments":{<br>    "app.argument1.appId":["123",<br>    "app.argument2.testId":["546","567"]<br> }<br>} |

dbfiddle here


您知道在 12.1 中执行此操作的方法吗?

您还可以将 EXISTS 与相关的 JSON_TABLE (which is available from Oracle 12c Release 1 (12.1.0.2)) 一起使用。:

select *
from   sample
where  EXISTS (
  SELECT 1
  FROM   JSON_TABLE(
           argument,'$.arguments."app.argument1.appId"[*]'
           COLUMNS (
             value VARCHAR2(100) PATH '$'
           )
         )
  WHERE  value = '123'
);

dbfiddle here