我需要一个搜索来匹配存储为空的值
问题描述:
我正在对传入几个变量并比较几个字段的单个表执行搜索查询。 像这样:我需要一个搜索来匹配存储为空的值
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字段中的空值会匹配什么?或者我怎么能让projectid返回所有的值,如果null的方式和名称会比较%?
答
在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)
答
这应该是你的项目的过滤器。如果参数是空的GUID,所有项目都匹配;如果不是,只有一个(或没有)匹配。
WHERE (@ProjectId = '00000000-0000-0000-0000-000000000000'
OR a.projectid = @ProjectId)
请看这里:WHERE(column = @参数OR NULLIF(@Parameter,'%')IS NULL)' – 2012-04-16 18:06:38