Попробуйте заменить код:
Select * FROM OPENJSON(Preference,'$.categories') WHERE Value IN(3) OR Value IS NULL
следующим:
SELECT * FROM OPENJSON (Preference) WHERE [key] = 'categories' AND ([value] like '%3%' OR [value] = '[]')
Проблема с использованием OPENJSON (Preference, '$ .categories) заключается в том, что когда массивпуст, табличная функция OPENJSON не возвращает строк.Это неотличимо от случая, когда массив категорий имеет значения, но ни один из них не равен «3».Итак, нам нужно изменить нашу методологию.
Просто проверяя OPENJSON (Предпочтение) и анализируя значение для категорий для 3 или '[]', мы получаем либо 1, либо 0 строк.1 строка означает, что наше условие найдено, 0 означает, что оно пропущено.
ПРИМЕЧАНИЕ: этот синтаксический анализ имеет некоторые большие недостатки.Если есть такие категории, как 13, 23, 30, 300 и т. Д., То все они будут соответствовать нашему шаблону% 3%.Я оставляю это вам на усмотрение анализа при необходимости.Я не знаю ваших вариантов использования.