代码之家  ›  专栏  ›  技术社区  ›  alwaysVBNET

在JSON列中查找数组长度

  •  0
  • alwaysVBNET  · 技术社区  · 6 年前

    我正在试着给我的查询结果打分。每个 'categories' 数组可能包含许多类别整数,或者 null . 如果为空,则应将其视为已找到。

    在下面的查询中,我正在搜索类别 3 找到了。然而 我不知道如何检查数组类别是否正确 NULL

    我试过:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Ryan B.    6 年前

    尝试替换代码:

    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(首选项,$.categories)的问题是,当数组为空时,OPENJSON表函数不返回任何行。这与categories数组有值,但没有一个值是“3”的情况没有区别。所以,我们需要改变我们的方法。

    只需检查OPENJSON(首选项)并解析3或“[]”的类别值,就可以返回1行或0行。1行表示我们的条件已找到,0表示未命中。

    注意:这种解析有一些很大的缺点。如果有13,23,30,300之类的分类。。。所有这些都符合我们的%3%模式。我让你根据需要加强分析。我不知道你的用例。