在SQL中等效于VB AndAlso?

j.s*_*ell 5 sql t-sql sql-server sql-server-2005 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)
Run Code Online (Sandbox Code Playgroud)

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

谢谢,詹姆斯.

gbn*_*gbn 6

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

WHERE
   CASE
      WHEN @a IS NULL THEN 1
      WHEN a = @a THEN 1
      ELSE 0
   END = 1
   AND /*repeat*/
Run Code Online (Sandbox Code Playgroud)

根据我的经验,这通常比让DB引擎排除它更慢.

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


The*_*edi 2

查询引擎将为您处理这个问题。正如您所写的,您的查询没有问题。如果可以的话,所有运营商都会“短路”。

  • 不,他们不会。您不知道它们在 SQL 中的计算顺序。 (12认同)