问题描述
下面是存储在名为“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