我正在对单个表进行搜索查询,该表传入多个变量并比较几个字段。 像这样:
WHERE a.callerfname LIKE @FName
AND a.callerlname LIKE @LName
AND a.callermname LIKE @MName
如果没有为其中一个字段选择值,则表单将以%发送,因此该字段与所有结果匹配。
一个字段是ProjectID
,它是一个Guid,可能包含null
个值。
当我在没有选择项目的情况下进行搜索时,表单会传入空白的Guid(000000-000 ...)并在CASE
中检查它,如下所示:
AND a.projectid = CASE WHEN @ProjectId <> '00000000-0000-0000-0000-000000000000'
THEN @ProjectId
ELSE a.projectid
END
麻烦的是,如果一行有一个NULL ProjectID
,那么它就不会匹配。
我的问题是guid字段中的null值会匹配什么?或者我如何使projectid返回所有值,如果null的方式和名称将与%?
答案 0 :(得分:0)
在SQL中,NULL不等于任何值,NULL不等于NULL。你必须测试“IS NULL”。或者,您可以将isnull(列,默认值)应用于测试的两侧。这些都应该有效。我没有使用guid,所以我将你的空guid值放在isNull条件中,因为你需要保持数据类型匹配,我认为这是一个有效的guid值。
AND ISNULL(a.projectid, '00000000-0000-0000-0000-000000000000') = CASE WHEN @ProjectId <> '00000000-0000-0000-0000-000000000000' THEN @ProjectId ELSE isnull(a.projectid, '00000000-0000-0000-0000-000000000000') END
或者
AND (a.projectid = CASE WHEN @ProjectId <> '00000000-0000-0000-0000-000000000000' THEN @ProjectId ELSE a.projectid END) OR (a.projectid is null)
答案 1 :(得分:0)
这应该是您的项目过滤器。如果参数是空guid,则所有项目都匹配;如果没有,只有一个(或没有)匹配。
WHERE (@ProjectId = '00000000-0000-0000-0000-000000000000'
OR a.projectid = @ProjectId)