Квадратные скобки Escape в Oracle и PostgreSQL - PullRequest
0 голосов
/ 29 января 2020

Я работаю над проектом, в котором база данных может быть экземпляром oracle или Postgres.

. Мне нужно написать запрос с похожей работой для обеих баз данных. Запрос работает с текстовым столбцом, содержащим строку JSON, например:

{"ruleName":"r2_an","divisionNameList":["div1"],"names":["name1"],"thirdTypeLabels":[],"secondTypeLabels":[],"firstTypeLabels":[]}

Мне нужно выбрать строки с пустым thirdTypeLabels.

select *
from my_table
where JSON like '%thirdTypeLabels%[]%';

Вкл. Oracle, например, ничего не извлекает, даже если в «my_table» имеется более одной совпадающей строки.

Запрос находится внутри программного обеспечения Java, использующего JDB C, потому что нам нужна производительность.

У вас есть предложения?

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Вы должны использовать правильный JSON синтаксический анализатор, иначе нет гарантии, что %thirdTypeLabels%[]% ограничит совпадение пустого массива парой thirdTypeLabels ключ-значение.

То же самое для Oracle 18 c Вы можете использовать:

SELECT id,
       thirdTypeLabelsCount
FROM   mytable t
       CROSS JOIN
       JSON_TABLE(
         t.json,
         '$'
         COLUMNS(
           thirdTypeLabelsCount NUMBER PATH '$.thirdTypeLabels.size()'
         )
       )
WHERE  thirdTypeLabelsCount = 0;

или

SELECT *
FROM   mytable
WHERE  JSON_EXISTS( json, '$ ? (@.thirdTypeLabels.size() == 0) ' )

дБ <> скрипка

2 голосов
/ 29 января 2020

Для Postgres у вас есть два варианта, чтобы этот запрос работал правильно:

select *
from the_table
where jsonb_array_length(json::jsonb -> 'thirdTypeLabels') = 0;

Или - начиная с Postgres 12 - используя JSON выражение пути

select *
from the_table
where jsonb_path_exists(json::jsonb, '$.thirdTypeLabels.size() ? (@ == 0)' );

Или используйте то же самое выражение пути JSON, что и в Oracle:

select *
from the_table
where jsonb_path_exists(json::jsonb, '$' ? (@.thirdTypeLabels.size() == 0)');

В Postgres также следует использовать столбец, определенный как jsonb вместо text (или varchar)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...