我需要搜索以匹配存储为null的值

时间:2012-04-16 17:53:52

标签: sql tsql

我正在对单个表进行搜索查询,该表传入多个变量并比较几个字段。 像这样:

          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的方式和名称将与%?

相比

2 个答案:

答案 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)