2009-10-30 33 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上測試