Разбор JSON
Oracle
Изучил возможности разбора JSON в Oracle, и мне удалось выполнить запрос, подобный этому:
select * from table t where json_exists(t.colB, '$.IDs[?(@.ID=="abc")]') or json_exists(t.colB, '$.IDs?(@.name=="abc"')
И внутри того жеВыражение запроса JSON:
select * from table t where json_exists(t.colB, '$.IDs[?(@.ID=="abc" || @.name=="abc")]')
Ключом к этому является вызов функции json_exists()
. Первый параметр может быть VARCHAR2
, и я также попытался использовать текст BLOB
, и он работает. Второй параметр - это путь к атрибуту вашего объекта json, который нужно проверить, с условием.
Я написал два OR
условия для ID
и Name
, но, возможно, тамявляется лучшим выражением запроса JSON, которое можно использовать для включения их обоих.
Подробнее о json_exists()
function здесь .
Postgres
Существуеттип данных JSON в Postgres, который поддерживает синтаксический анализ в запросах. Итак, если ваш столбец colB
объявлен как JSON, вы можете сделать что-то вроде этого:
select * from table where colB->>'Name' LIKE '%abc%';
И для того, чтобы получить доступ к элементам массива массива идентификаторов, вы должны использовать функцию json_array_elements()
.
select * from table, json_array_elements(colB->'IDs') e where colB->>'Name' LIKE '%abc%' or e->>'ID' = 'abc';
Проверьте пример, который я создал для вас здесь .
Здесь - это онлайн-инструмент для онлайн-тестирования ваших запросов JSON.
Проверьте также этот вопрос в SO.
MSSQL Server 2017
Я провел пару тестов также с MS SQL Server, и мне удалось создатьпример поиска частичного совпадения в поле имени.
select * from table where JSON_VALUE(colB,'$.Name') LIKE '%abc%';
И наконец я пришел к рабочему запросу, который выполняет частичное совпадение с полем Name
и полное совпадение с полем ID
, например:
select * from table t
CROSS APPLY OPENJSON(colB, '$.IDs') WITH (
ID VARCHAR(10),
CodingSystem VARCHAR(10)
) e
where JSON_VALUE(t.colB,'$.Name') LIKE '%abc%'
or e.ID = 'abc';
Проблема в том, что нам нужно открыть массив IDs
и создать из него что-то вроде таблицы, к которой можно также обратиться, обратившись к его столбцам.
ПримерЯ создал здесь .
LIKE текстовый запрос
Ваши попытки хороши, но вы теряете символы %
. Они должны быть первыми и последними в вашей заданной строке:
Если вы хотите, чтобы идентификатор был заданным значением:
SELECT * FROM table where colB LIKE '%"ID":"abc"%'
Если заданное значение может быть где угодно, то невведите "ID"
part:
SELECT * FROM table where colB LIKE '%abc%'
Если данное значение может быть только в поле ID или имени, тогда:
SELECT * FROM table where colB LIKE '%"ID":"abc"%' OR colB LIKE '%"Name":"abc"%'
И поскольку вы даете жестко закодированные идентификаторыполя (например, ID и имя), которые могут быть в переменном регистре:
SELECT * FROM table where lower(colB) LIKE '%"id":"abc"%' OR lower(colB) LIKE '%"name":"abc"%'
Предполагая, что количество пробелов не меняется между символом :
и значением или именем свойств.
Для частичного сопоставления вы можете использовать больше %
между ними, например '%"name":"%abc%"%'
:
SELECT * FROM table where lower(colB) LIKE '%"id":"abc"%' OR lower(colB) LIKE '%"name":"%abc%"%'
Регулярные выражения
Другой вариант - проверка с регулярными выражениями. Попробуйте проверить это: Oracle извлекает поля json с помощью регулярного выражения с оракулом regexp_substr