1

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

          WHERE  a.callerfname LIKE @FName
                 AND a.callerlname LIKE @LName
                 AND a.callermname LIKE @MName

如果没有为其中一个字段选择任何值,则表单以 % 发送,因此该字段匹配所有结果。

一个字段是ProjectIDGuid,可能包含null值。当我在没有选择项目的情况下进行搜索时,表单会传入空白的 Guid (000000-000 ...),然后我会CASE像这样检查它:

AND a.projectid = CASE WHEN  @ProjectId <> '00000000-0000-0000-0000-000000000000'
                       THEN  @ProjectId
                       ELSE a.projectid
                             END

问题是如果一行有 aNULL ProjectID它不会匹配自己。我的问题是 guid 字段中的空值匹配什么?或者,如果与 % 相比,我如何让 projectid 返回所有值,如果为 null,方式和名称会如何?

4

2 回答 2

0

这应该是您的项目过滤器。如果参数为空 guid,则所有项目都匹配;如果不是,则只有一个(或没有)匹配。

WHERE (@ProjectId = '00000000-0000-0000-0000-000000000000'
       OR a.projectid = @ProjectId)
于 2012-04-16T18:14:45.647 回答
0

在 SQL 中 NULL 不等于任何值,并且 NULL 不等于 NULL。您必须测试“IS NULL”。或者,您可以将 isnull(column, default value) 应用于测试的双方。这些中的任何一个都应该起作用。我不太使用 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)
于 2012-04-16T18:03:40.720 回答