SQL-запрос с условием частичного совпадения - PullRequest
0 голосов
/ 16 октября 2019

У меня есть столбец таблицы, как показано ниже. что такое оператор запроса sql, который я могу использовать, чтобы иметь несколько условий частичного совпадения?

поиск по идентификатору или имени

если поиск abc, перечислите строку A1, строку A2

если тест поиска, перечислите строку A1, строку A2, строку 3

, если ищите ghj, перечислите строку A2

Я пытался это, но ничего не возвращалось:

 SELECT * FROM table where colB LIKE '"ID":"%abc%"'

table column

обновление данных в тексте

{"ItemId":"123","IDs":[{"ID":"abc","CodingSystem":"cs1"}],"Name":"test itemgh"}

{"ItemId":"123","IDs":[{"ID":"ghj","CodingSystem":"cs1"}],"Name":"test abc"}

{"ItemId":"123","IDs":[{"ID":"defg","CodingSystem":"cs1"}],"Name":"test 111"}

1 Ответ

0 голосов
/ 16 октября 2019

Разбор 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

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