首页 > 解决方案 > 如何在 JSON_EXISTS Oracle SQL Developer 中使用双引号传递参数

问题描述

我创建了一个表

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用双引号传递参数

标签: sqljsonoracleoracle-sqldeveloper

解决方案


如果要将变量传递给 中的 JSON 路径json_exists,请使用以下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" }}    

'john'passing子句中成为: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" }}   

然后,您可以像查询非 JSON 数据一样替换为'john':johnParam


推荐阅读