2015-04-01 104 views
0

我想要做的是基於where子句條件之間的條件切換..這是可能的嗎?Where clause with switch case or dynamic where

這是一個例子,實際的過程更長,我不想使用,如果選擇。

可能嗎?

declare @city varchar(100) = 'NY' 

SELECT s.suppliers, o.order 
FROM suppliers s 
INNER JOIN orders o ON s.id = o.id 
WHERE 
    CASE WHEN @city = 'NY' 
      THEN (s.SupplierName = o.SupplierName AND o.Row = 'New') 
     ELSE s.SupplierName = o.SupplierName 
    END 
+1

CASE是一個帶有一個輸出的表達式,不能像IF條件那樣使用它來控制流。 http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of-the-case-expression – 2015-04-01 18:56:16

+0

@AaronBertrand如果你不能使用,那麼會有什麼替代? – NoviceDeveloper 2015-04-01 18:58:16

+0

'WHERE s.SupplierName = o.SupplierName AND o.Row = CASE @city當'NY'那麼'新的'ELSE o.Row END'。如果o.Row可以爲空,則更復雜一點。 – 2015-04-01 18:59:38

回答

2

我做之前與此類似:

WHERE s.SupplierName = o.SupplierName 
AND 
CASE WHEN @city = 'NY' AND o.Row = 'New' THEN 1 
WHEN @city <> 'NY' THEN 1 
ELSE 0 END = 1 

你可以得到你想要的那樣複雜,但看你怎麼做,以保持合理的性能。

+0

這給1或0 ..不完全得到我想要的結果。 – NoviceDeveloper 2015-04-01 19:34:34

+0

你的邏輯將產生一個1,然後where子句將成立。 – JBrooks 2015-04-01 19:39:17

+0

@NoviceDeveloper - 請參閱[本](http://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition/10260297#10260297)另一種解釋。 – HABO 2015-04-01 19:58:14

1

你不需要爲這個case,您可以把常用的條件ON子句中:

SELECT s.suppliers, o.order 
FROM suppliers s INNER JOIN 
    orders o 
    ON s.id = o.id AND s.SupplierName = o.SupplierName 
WHERE (@city = 'NY' AND o.Row = 'New') OR 
     (@city <> 'NY'); 

這假定@cityNULL。包含這種可能性的邏輯稍微複雜一些(儘管看起來沒有必要)。

+0

不會爲這兩種情況拉動記錄嗎?我認爲它的確如此......我希望它能夠在紐約市和紐約市都得到,如果情況並非如此,那麼只有當紐約市...不是兩個。 – NoviceDeveloper 2015-04-01 19:33:46

+0

@NoviceDeveloper。 。 。這實現了你試圖用'case'表達式表達的邏輯。 '@ city'變量只有一個值用於執行查詢,因此只有在任何給定的運行中才會使用該條件。 – 2015-04-01 22:25:35