Как проверить, содержится ли определенная строка в массиве, возвращаемом JSON_QUERY - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь написать оператор SQL, который будет анализировать некоторые JSON и возвращать только те строки, в которых один из массивов в объекте JSON содержит заданное значение.

Пример JSON:

Object 1:
{
  "Key1": ["item1", "item2", "item3"]
}

Object 2:
{
  "Key1": ["item1", "item3"]
}

Я бы хотел возвращать только те строки, где JSON_QUERY(object, '$.Key1').Contains("item2") истинно (в данном примере, Объект 1).

Конечно, эта магическая функция 'Contains ()' не существует в tsql, и яне могу найти какую-либо документацию функции, которая работает так, как мне хотелось бы.

РЕДАКТИРОВАТЬ: Мое текущее решение (которое я не очень люблю и хотел бы заменить) проверяет, является ли строковый литерал '"item1"' содержится в значении, возвращаемом JSON_QUERY.Мне это не нравится, потому что, возможно, запись в массиве может иметь значение, подобное '123123"item1"123123', и тогда условное выражение вернет true.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы можете использовать OPENJSON, чтобы получить производный набор результатов из списка или массива json:

В следующем запросе используется JSON_QUERY для получения списка строк в Key1.Это передается в качестве аргумента в OPENJSON для извлечения списка строк как производной таблицы:

DECLARE @jsonTable TABLE(ID INT IDENTITY, JsonString NVARCHAR(MAX));
INSERT INTO @jsonTable VALUES
 (N'{
  "Key1": ["item1", "item2", "item3"]
    }')
,(N'{
  "Key1": ["item1", "item3"]
    }');

DECLARE @LookFor NVARCHAR(100)='Item2'

SELECT jt.ID
      ,jt.JsonString
      ,A.value
FROM @jsonTable jt
OUTER APPLY OPENJSON(JSON_QUERY(jt.JsonString,N'$.Key1')) AS A
--WHERE A.value=@LookFor

Раскомментируйте окончательный WHERE, чтобы уменьшить список до строк со значением Item2 (какопределено в переменной @LookFor).

0 голосов
/ 11 июня 2018

Christian,

Похоже, ваш SQL-запрос может использовать предложение where с использованием сравнения LIKE для столбца

WHERE col1 LIKE 'some%funky%string'

% является падежом с подстановочными знаками

...