Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
546 views
in Technique[技术] by (71.8m points)

json - How to pass parameter with double quote inside JSON_EXISTS Oracle SQL Developer

I have created a table

CREATE TABLE json_data(
                       json_col   VARCHAR2(1000), 
                       CONSTRAINT must_be_json CHECK (json_col IS JSON )
                      )

Inserted Data into table

INSERT INTO json_data VALUES ('{ "abc" : { "fname" : "john" ,"lname" : "rambo" }}')
INSERT INTO json_data VALUES ('{ "abc" : { "fname" : "james" ,"lname" : "bond" }}')

Need to select value using below query

SELECT json_col FROM json_data 
WHERE JSON_EXISTS(json_col, '$.abc') 
    AND JSON_EXISTS(json_col,'$?(@.abc.name == "john")')

works fine without problem, however I need to pass value "John" as parameter like..

SELECT json_col FROM json_data 
WHERE JSON_EXISTS(json_col, '$.abc') 
    AND JSON_EXISTS(json_col,'$?(@.abc.name == :johnParam)'

where :johnParam is a parameter

its not taking as parameter, please help me how to pass :johnParam parameter with double quotes


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

If you want to pass a variable to a JSON path in json_exists, use the passing clause:

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' in the passing clause becomes :johnParam in your application.

To search for documents where an attribute equals a specific value, you may find it easier to use simple dot-notation or json_value instead:

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" }}   

Then you can replace 'john' with :johnParam as you would for queries against non-JSON data.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...