在JSON列中查找数组的长度

时间:2018-10-02 16:15:38

标签: sql sql-server sql-server-2016

我正在尝试对查询结果进行评分。每个'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 :(得分:0)

尝试替换您的代码:

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(Preference)并解析3或'[]'类别的值,我们就可以得到1或0行。第1行表示找到我们的条件,第0行表示未命中。

注意:此解析有一些很大的缺点。如果有13、23、30、300等类别,那么所有这些都将与我们的%3%模式匹配。我将它留给您以根据需要加强解析。我不知道您的用例。