Oracle 12c 中的 JSON_VALUE 和 JSON_TEXTCONTAINS 有什么区别?

What's the difference between JSON_VALUE and JSON_TEXTCONTAINS in Oracle 12c?

我正在使用 Oracle 12c 和 SQL Developer,我还在

列中保留 JSON
CREATE TABLE APPLICATION(
  id varchar2(36) PRIMARY KEY, 
  APPLICATION clob,
  constraint APPLICATION check (APPLICATION is JSON)
);

然后我插入了一些行

insert into APPLICATION values(SYS_GUID(), <huge JSON>);

我想进行查询以从 json 列中获取特定字段。

Select app.application
From APPLICATION app
Where (JSON_VALUE(app.application, '$.fields.CustomerID') IN ('Bank0', 'Bank1', 'Bank2', 'Bank3', '001pepebottle', '08092015CoappOrg', 'ConsortiumOrg')) 
AND JSON_VALUE(app.application, '$.arrays.PII.arrays.PN.fields.DocumentId', '213213');

但我得到了:

Error en la línea de comandos:4 Columna:75
Informe de error:
Error SQL: ORA-00907: falta el paréntesis derecho
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

使用 JSON_TEXTCONTAINS 我得到了很多不好的结果(我知道它们是错误的,因为我没有坚持 JSOn 字段 DocumentID 等于 213213

有什么区别?

JSON_TEXTCONTAINS is a conditiion; while JSON_VALUE is a function.

您似乎将对 JSON_VALUE 的第二次调用视为一个条件 - 您没有将其结果与任何内容进行比较,并且传递了太多参数,这导致了 ORA-00907 错误.针对第4行第75列报错,也就是....DocumentId'.

后面的逗号

看起来您确实想将它 returns 的值与您的固定字符串进行比较:

AND JSON_VALUE(app.application, '$.arrays.PII.arrays.PN.fields.DocumentId') = '213213'

AND JSON_VALUE(app.application, '$.arrays.PII.arrays.PN.fields.DocumentId' NUMBER) = 213213