SQL Server 2008 - 忽略空值

时间:2009-09-20 09:51:27

标签: sql-server

我有以下查询(在sproc中运行):

  

DECLARE @BrandId uniqueidentifier

     

SELECT * FROM Products p WHERE p.BrandId = @ BrandId

我的问题是 - 当NULL被传递到@BrandId时,查询(正确)没有返回任何结果 - 有一种方法告诉SQL在将NULL传递给@BrandId时返回所有行(没有使用大量的IF语句,即 - IF @BrandId IS NULL等)? - 即当'忽略'那个部分的where子句时@BrandId = NULL。

以上是一个简化示例 - 真正的查询更长并且有多个变量(如@BrandId)可以传递空值 - 并且期望的行为是他们在传递空值时不限制查询结果

谢谢!

1 个答案:

答案 0 :(得分:2)

DECLARE @BrandId uniqueidentifier;

SELECT * FROM Products p WHERE p.BrandId = ISNULL(@BrandId, p.BrandId);

我唯一的评论是,如果你有很多产品,这个查询模式将不会针对BrandId为NULL(如果你将查询放在存储过程中)的情况进行高度优化,因为只能存储一个计划每个声明的程序。

如果您在存储过程中使用此语句并且您真的关心高性能(即,如果您有很多产品并且您经常运行此查询),则应使用:

IF @BrandId IS NULL BEGIN
    SELECT * FROM Products p;
END ELSE BEGIN
    SELECT * FROM Products p WHERE p.BrandId = @BrandId;
END