我有以下查询(在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)可以传递空值 - 并且期望的行为是他们在传递空值时不限制查询结果
谢谢!
答案 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