Вы можете использовать условие is json
, чтобы отфильтровать недействительные JSON:
create table t (
what varchar2(20),
c1 varchar2(500)
);
insert into t
values ( 'valid JSON', '[{"productCode":"AD","serials":[{"id":"234242343","isPrimary":true}]},{"productCode":"BC","serials":[{"id":"23345345","isPrimary":true}]}]' );
insert into t
values ( 'invalid JSON', '"productCode":"AD","serials":[{"id":"234242343","isPrimary":true}]},{"productCode":"BC","serials":[{"id":"23345345","isPrimary":true}]}]' );
commit;
select what from t
where c1 is json;
WHAT
valid JSON
Но это не нужно: json_table
уже игнорирует недействительные документы!
SELECT what, j.*
FROM t, JSON_TABLE(
c1, '$[*]'
columns(
productCode varchar2 PATH '$.productCode' NULL ON ERROR,
serials varchar2 format JSON PATH '$.serials' NULL ON ERROR
)
) j;
WHAT PRODUCTCODE SERIALS
valid JSON AD [{"id":"234242343","isPrimary":true}]
valid JSON BC [{"id":"23345345","isPrimary":true}]
Вы можете принудительно вызвать ошибку JSON с помощью предложения on error
:
SELECT what, j.*
FROM t, JSON_TABLE(
c1, '$[*]'
error on error
columns (
productCode varchar2 PATH '$.productCode' NULL ON ERROR,
serials varchar2 format JSON PATH '$.serials' NULL ON ERROR
)
) j;
ORA-40441: JSON syntax error