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

时间:2016-12-29 15:00:39

标签: sql json oracle-sqldeveloper oracle12c

我正在使用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

有什么区别?

1 个答案:

答案 0 :(得分:2)

JSON_TEXTCONTAINS is a conditiion;而JSON_VALUE is a function

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

看起来你真的想要将它返回的值与固定字符串进行比较:

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