如何在 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 中使用双引号传递参数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何将姓名中有空格的字段更新成没有空格的?

密码不能包含oracle数据库中的用户名或用户全名的一部分(pl/sq)

如何在 Oracle 中列出活动/打开的连接?

oracle 10如何修改字符集?

Oracle db:如何在字符串的特定位置添加空格

Oracle银行存取钱系统