Я сталкиваюсь с проблемой при фильтрации записей в таблице SQL Server 2017, в которой есть столбец VARCHAR со значениями типа JSON:
Примеры строк таблицы со значениями столбцов JSON:
Row # 1. {"Department":["QA"]}
Row # 2. {"Department":["DEV","QA"]}
Row # 3. {"Group":["Group 2","Group 12"],"Cluster":[Cluster 11"],"Vertical":
["XYZ"],"Department":["QAT"]}
Row # 4. {"Group":["Group 20"],"Cluster":[Cluster 11"],"Vertical":["XYZ"],"Department":["QAT"]}
Теперь мне нужно отфильтровать записи из этой таблицы на основе входного параметра, который может иметь следующий формат:
Пример входного параметра JSON для запроса:
1. `'{"Department":["QA"]}'` -> This should return Row # 1 as well as Row # 2.
2. `'{"Group":["Group 2"]}'` -> This should return only Row # 3.
Таким образом, поиск должен быть таким, как если бы значение столбца содержало «любой доступный тег json с любым подходящим значением», а затем вернуть эти соответствующие записи.
Примечание. Это похоже на jsonb PostgreSQL, как показано ниже:
Предложение фильтра PostgreSQL:
TableName.JSONColumnName @> '{"Department":["QA"]}'::jsonb
Проведя исследования в Интернете, я обнаружил возможность OPENJSON, доступную в SQL Server, которая работает следующим образом.
Пример примера OPENJSON:
SELECT * FROM
tbl_Name UA
CROSS APPLY OPENJSON(UA.JSONColumnTags)
WITH ([Department] NVARCHAR(500) '$.Department', [Market] NVARCHAR(300) '$.Market', [Group] NVARCHAR(300) '$.Group'
) AS OT
WHERE
OT.Department in ('X','Y','Z')
and OT.Market in ('A','B','C')
Но проблема этого подхода заключается в том, что если в будущем возникнет необходимость поддерживать какой-либо новый тег в JSON (например, «Область»), его также необходимо будет добавить в каждую хранимую процедуру, в которой реализована эта логика.
Существуют ли какие-либо возможности SQL Server 2017, которые мне не хватает, или какой-либо динамический способ реализовать то же самое?