Предложение Between для массива числовых значений в строке для столбца типа JSON

#json #sql-server #json-value

#json #sql-сервер #json-значение

Вопрос:

У меня есть таблица с одним столбцом, содержащим объекты типа JSON (тип столбца nvarchar ), и мне требуется фильтровать строки.

Объект JSON — это массив объектов, содержащий несколько полей, есть ли способ применить предложение between к каждому значению массива и вернуть эту строку, если она совпадает.

 ROW_1 = [{"key": 12}, {"key": 13}, {"key": 19}]
 

Для приведенной выше строки, если предложение between имеет диапазон от 15 до 22, то следует выбрать эту строку.

В приведенном выше требовании я вижу две проблемы: 1. использовать подстановочные знаки для выбора всех ключей, а другое — применять предложение between к каждому значению.

Аналогичный вариант использования — выбрать строку, если она соответствует значению, для которого я сделал что-то вроде приведенного ниже

 select * 
from table 
where CAST(JSON_QUERY(column, '

Дайте мне знать, можно ли это сделать с помощью запроса T-SQL.

PS. Другие альтернативы включают загрузку всех данных с помощью python и фильтрацию там. (но меня беспокоит то, что мне нужно будет каждый раз загружать полные данные, что может замедлить фильтрацию из-за увеличения количества строк в будущем).


Комментарии:

1. Что должно быть между 15 to 22 ? Любое значение ключа или все значение ключа?

2. JSON недопустим (он должен быть [{"key": 12}, {"key": 13}, {"key": 19}] ).

3. @ArunPalanisamy Любое значение ключа

Ответ №1:

Вы можете использовать APPLY оператор и OPENJSON() вызов для анализа сохраненного JSON и применения соответствующего WHERE предложения:

 SELECT * 
FROM (VALUES (N'[{"key": 12}, {"key": 13}, {"key": 19}]')) v (JsonData)
CROSS APPLY OPENJSON(v.JsonData) WITH ([key] int '$.key') j
WHERE j.[key] BETWEEN 5 AND 12
 

), nvarchar(max)) LIKE '%"key": 12%'
Дайте мне знать, можно ли это сделать с помощью запроса T-SQL.

PS. Другие альтернативы включают загрузку всех данных с помощью python и фильтрацию там. (но меня беспокоит то, что мне нужно будет каждый раз загружать полные данные, что может замедлить фильтрацию из-за увеличения количества строк в будущем).

Комментарии:

1. Что должно быть между 15 to 22 ? Любое значение ключа или все значение ключа?

2. JSON недопустим (он должен быть [{"key": 12}, {"key": 13}, {"key": 19}] ).

3. @ArunPalanisamy Любое значение ключа

Ответ №1:

Вы можете использовать APPLY оператор и OPENJSON() вызов для анализа сохраненного JSON и применения соответствующего WHERE предложения: