Подстановочный знак MS SQL для исключения одного или нескольких символов - PullRequest
0 голосов
/ 23 апреля 2020

Я сохранил массив json в одном столбце таблицы SQL (сервер MS SQL). Теперь я хочу отфильтровать несколько строк, используя как "шаблон" и подстановочные знаки. Сохраненный объект выглядит примерно так:

[{"id":"W678","value":"282779"},
 {"id":"O891","value":"25896"},
 {"id":"E859","value":"12711"},
 {"id":"M914","value":"31513"}]

и, например, я хочу отфильтровать строки, в массиве которых JSON есть элемент с "id" = "W678" и значением, содержащим "27"

В случае использования регулярного выражения у меня сработало следующее регулярное выражение:

/.+{"id":"W678","value":"[^{}]*27[^{}]*"}.+/

Но я не знаю, как перевести вышеприведенное регулярное выражение в выражение SQL с подстановочными знаками. Я пробовал что-то подобное, но это не работает.

LIKE '%{"id":"W678","value":"[^{}]%' + @Value + '[^{}]*%"}%'

Спасибо

1 Ответ

3 голосов
/ 23 апреля 2020

Возможный подход состоит в том, чтобы проанализировать массив JSON и вернуть его содержимое в виде таблицы, используя OPEN JSON () и явную схему в предложении WITH. Затем, используя подход на основе множеств, вы можете отфильтровать содержимое и найти подходящие строки.

Таблица:

CREATE TABLE Data (JsonData varchar(1000))
INSERT INTO Data (JsonData) 
VALUES ('[
   {"id":"W678","value":"282779"},
   {"id":"O891","value":"25896"},
   {"id":"E859","value":"12711"},
   {"id":"M914","value":"31513"}
 ]')

Заявление:

 SELECT d.*
 FROM Data d
 CROSS APPLY (
    SELECT *
    FROM OPENJSON (d.JsonData) WITH (
       id varchar(4) '$.id',
       value varchar(6) '$.value'
    )
    WHERE [id] = 'W678' AND [value] LIKE  '%27%'
 ) a

Примечание, это явное определение схемы зависит от структуры массива JSON.

...