如何在 JSON_EXISTS Oracle SQL Developer 中使用双引号传递参数
Posted
技术标签:
【中文标题】如何在 JSON_EXISTS Oracle SQL Developer 中使用双引号传递参数【英文标题】:How to pass parameter with double quote inside JSON_EXISTS Oracle SQL Developer 【发布时间】:2021-01-11 11:08:44 【问题描述】:我已经创建了一个表
CREATE TABLE json_data(
json_col VARCHAR2(1000),
CONSTRAINT must_be_json CHECK (json_col IS JSON )
)
插入数据到表中
INSERT INTO json_data VALUES (' "abc" : "fname" : "john" ,"lname" : "rambo" ')
INSERT INTO json_data VALUES (' "abc" : "fname" : "james" ,"lname" : "bond" ')
需要使用以下查询选择值
SELECT json_col FROM json_data
WHERE JSON_EXISTS(json_col, '$.abc')
AND JSON_EXISTS(json_col,'$?(@.abc.name == "john")')
工作正常没有问题,但是我需要将值“John”作为参数传递..
SELECT json_col FROM json_data
WHERE JSON_EXISTS(json_col, '$.abc')
AND JSON_EXISTS(json_col,'$?(@.abc.name == :johnParam)'
:johnParam
是一个参数
它不作为参数,请帮助我如何用双引号传递:johnParam
参数
【问题讨论】:
您真正的问题是如何在JSON_EXISTS
表达式中使用参数?
是的,用双引号
数据中没有双引号,那么双引号和这个有什么关系呢?字符串值不包含其分隔符。 真正的 问题应该是您是否可以使用带有JSON_EXISTS
的参数。如果可以,您可以将整个表达式作为参数传递。
您首先假设您可以在字符串中传递参数。你不能。参数不是字符串替换变量,它们类似于 Java 函数参数。 也许您可以将整个表达式作为参数传递并编写 AND JSON_EXISTS(json_col,:someParam)
但一些 SO 问题表明这也不可能
您可以使用PASSING clause 在JSON 路径表达式中包含一个外部值,例如json_exists(po_document, '$.PONumber?(@ > $d)' PASSING 1500 AS "d")
。或许你可以使用PASSING
中的参数,例如PASSING :myParam AS "d")
【参考方案1】:
如果要将变量传递给 json_exists
中的 JSON 路径,请使用 passing
子句:
create table json_data (
json_col varchar2(1000)
check ( json_col is json )
);
insert into json_data
values (' "abc" : "fname" : "john" ,"lname" : "rambo" ');
insert into json_data
values (' "abc" : "fname" : "james" ,"lname" : "bond" ');
select json_col from json_data
where json_exists (
json_col,
'$?(@.abc.fname == $johnparam)'
passing 'john' as "johnparam"
);
JSON_COL
"abc" : "fname" : "john" ,"lname" : "rambo"
passing
子句中的'john'
在您的应用程序中变为:johnParam
。
要搜索属性等于特定值的文档,您可能会发现使用简单的点表示法或json_value
会更容易:
select * from json_data j
where j.json_col.abc.fname = 'john';
JSON_COL
"abc" : "fname" : "john" ,"lname" : "rambo"
select * from json_data j
where json_value ( json_col, '$.abc.fname' ) = 'john';
JSON_COL
"abc" : "fname" : "john" ,"lname" : "rambo"
然后,您可以将 'john'
替换为 :johnParam
,就像查询非 JSON 数据一样。
【讨论】:
【参考方案2】:您可以在以下查询中使用带有 & 符号的替换参数,例如 &name
SELECT json_col
FROM json_data
WHERE JSON_EXISTS(json_col, '$.abc?(@.fname == "&name")')
JSON_EXISTS(json_col, '$.abc')
部分似乎是多余的。出现提示时,输入不带引号的john
作为$name
的值。
【讨论】:
以上是关于如何在 JSON_EXISTS Oracle SQL Developer 中使用双引号传递参数的主要内容,如果未能解决你的问题,请参考以下文章