Найти длину массива в столбце JSON - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь дать оценку по результатам моего запроса.Каждый массив 'categories' может содержать много целых чисел категории или может быть null.Если значение равно нулю, его следует считать найденным.

В приведенном ниже запросе я ищу категорию 3, которая найдена.Однако Я не знаю, как я могу проверить, есть ли категории Массив NULL, поэтому я могу также возвратить 1, что решит мою проблему.

Я пытался:

WHERE Value IN(3) OR Value IS NULL)

WHERE Value IN(3) OR Value.length =0)

WHERE Value IN(3) OR Value = '') 

и т.д ....

Например,

  1. {"categories":[1,2,3],"distance":[130,300],"companysize":[2,4],"budget":[5000,1000000]}
  2. {"categories":[],"distance":[60,200],"companysize":[1,2],"budget":[250,100]}

SQL

     SELECT * FROM (SELECT 
             (CASE WHEN EXISTS (Select * FROM OPENJSON(Preference,'$.categories') 
              WHERE Value IN(3) OR Value IS NULL)  -- < problem is here
              THEN 1 ELSE 0 END)
              matchscore, p.*
              FROM FinNotificationsPreferences p) x

1 Ответ

0 голосов
/ 02 октября 2018

Попробуйте заменить код:

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%.Я оставляю это вам на усмотрение анализа при необходимости.Я не знаю ваших вариантов использования.

...