Ну, я не уверен, поможет ли это вам ...
Это может помочь преобразовать вложенный массив в производную таблицу, чтобы использовать его в качестве CTE. Проверьте это:
DECLARE @TestTable TABLE
(
Id int,
JsonData nvarchar(4000)
);
INSERT INTO @TestTable
VALUES
(1,'{"categories":["one","two"]}'),
(2,'{"categories":["one"]}'),
(3,'{"categories":["two"]}'),
(4,'{"categories":["one","two","three"]}');
- это запрос
WITH JsonAsTable AS
(
SELECT Id
,JsonData
,cat.*
FROM @TestTable tt
CROSS APPLY OPENJSON(tt.JsonData,'$.categories') cat
)
SELECT *
FROM JsonAsTable
Подход очень близок к запросу, который вы создали сами. В результате получается таблица с одной строкой для каждой записи массива. Форма Id
- это повторяющийся ключ группировки, key
- порядковый номер в массиве, а value
- это одно из слов, которые вы ищете.
В своем запросе вы можете использовать JsonAsTable
, как если бы вы использовали любую другую таблицу в этом месте.
Но - вместо повторяющихся FROM OPENJSON
запросов - вам понадобятся повторяющиеся предикаты EXISTS()
...
Хакерское решение может быть таким:
SELECT Id
,JsonData
,REPLACE(REPLACE(REPLACE(JsonData,'{"categories":[','",'),']}',',"'),'","',',')
FROM @TestTable
Это вернет все значения вложенного массива в одну строку, разделенные запятой. Вы можете запросить это, используя шаблон LIKE
... Вы можете вернуть это как вычисляемый столбец, хотя ...