在SQL中等效于VB AndAlso?

时间:2009-10-30 11:18:42

标签: sql sql-server sql-server-2005 tsql short-circuiting

在SQL(SQL Server 2005)中是否存在等效于VB的AndAlso / OrElse和C#的&& / ||。我正在运行类似于以下内容的选择查询:

SELECT a,b,c,d
FROM table1
WHERE 
(@a IS NULL OR a = @a)
AND (@b IS NULL OR b = @b)
AND (@c IS NULL OR c = @c)
AND (@d IS NULL OR d = @d)

例如,如果将“@a”参数作为NULL传入,则无法评估WHERE子句的第二部分(a = @a)。有没有办法通过使用特殊语法或重写查询来避免这种情况?

谢谢, 詹姆斯。

5 个答案:

答案 0 :(得分:5)

保证评估顺序的唯一方法是使用CASE

WHERE
   CASE
      WHEN @a IS NULL THEN 1
      WHEN a = @a THEN 1
      ELSE 0
   END = 1
   AND /*repeat*/

根据我的经验,这通常比让DB引擎排序更慢。

TerrorAustralis的答案通常是非可空列的最佳选择

答案 1 :(得分:3)

试试这个:

AND a = ISNULL(@a,a)

此功能查看@a。如果它不为null,则等同于表达式

AND a = @a

如果为null,则等同于表达式

AND a = a 

(因为这总是如此,它取代了@b是null语句)

答案 2 :(得分:1)

查询引擎会为您处理此问题。你写的查询很好。如果可以的话,所有操作员都会“短路”。

答案 3 :(得分:0)

另一种方法是:

IF (@a > 0) IF (@a = 5)
BEGIN

END

另一个如果在条件之后会做一个" AndAlso"逻辑。

我想要说明这只是一个简短的写作方式:

IF (@a > 0) 
     IF (@a = 5)
     BEGIN

     END

答案 4 :(得分:0)

举个例子:

SELECT * FROM Orders
WHERE orderId LIKE '%[0-9]%' 
AND dbo.JobIsPending(OrderId) = 1 

Orders.OrderId是varchar(25)

带有int参数的

dbo.JobIsPending(OrderId) UDF

由于转换在dbo.JobIsPending(OrderId) when Orders.OrderId NOT LIKE '%[0-9]%'

中失败,因此没有造成短路

在SQL Server 2008 R2上测试