我正在使用Oracle 12c和SQL Developer,我也在列
中持久化JSONCREATE 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
)
有什么区别?
答案 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