2009-10-30 31 views
4

在SQL(SQL Server 2005)中是否存在VB的AndAlso/OrElse和C#的&&/||。我运行类似于下面的一个选择查询:相当于VB并且还在SQL中?

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) 

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

谢谢, 詹姆斯。

回答

2

查询引擎将为您处理此问题。你写的查询很好。如果可能的话,所有运营商都将“短路”。

+10

不,他们不会。你不知道他们将在SQL中评估他们的顺序。 – gbn 2010-07-18 12:41:45

3

试试这个:

AND a = ISNULL(@a,a) 

此功能着眼于@a。如果它不是null,则相当于表达

AND a = @a 

如果为null,则相当于表达

AND a = a 

(因为这始终是真实的,它取代了@b是空语句)

5

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

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

以我的经验这通常比较慢,然后让数据库引擎对它进行排序。

TerrorAustralis的答案通常是不可为空列

0

另一种方式是做的最好的选择:

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

END 

另外,如果后病情会做一个“AndAlso”的逻辑。

我想emphesise,这只是写一个简短的方式:

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

    END 
0

拿这个例子:

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

Orders.OrderId为varchar(25)

dbo.JobIsPending(OrderId) UDF为int参数

没有短路作为转换失败dbo.JobIsPending(OrderId) when Orders.OrderId NOT LIKE '%[0-9]%'

在SQL Server 2008 R2上测试