我正在尝试对查询结果进行评分。每个'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 = '')
等...
例如
{"categories":[1,2,3],"distance":[130,300],"companysize":[2,4],"budget":[5000,1000000]}
{"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
答案 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%模式匹配。我将它留给您以根据需要加强解析。我不知道您的用例。