2010-01-06 155 views
3

我必須根據條件運行SQL查詢。 有2個AND條件只有在條件滿足時才需要執行。我們可以在這裏使用CASE語句嗎?如果是這樣如何?或者還有其他方法嗎?在SQL SELECT語句中給出條件

SELECT * FROM MyTable 
WHERE [email protected] 

if condition1 here 
AND col2 = @val2 
end if 

if condition2 here 
AND col3 = @val3 
end if 

任何人都可以幫助我這個請。我使用SQL Server 2005的

+0

其中任何答案有幫助嗎? :) – 2010-05-19 20:14:28

回答

8

讓他們在您的查詢,像這樣:

SELECT * FROM MyTable 
WHERE [email protected] 
And (Not Condition1 Or col2 = @val2) 
And (Not Condition2 Or col3 = @val3) 

所以,如果沒有條件1(意爲:條件1爲true),然後COL2(必須)= @ VAL2 。

(我改變了第二個條件邏輯和COL3 = @ VAL3,因爲你曾反覆COL2 = @ VAL2

編輯迴應評論: 給我的標準的一個例子爲condition1。明確如果語法未在t-sql中的查詢中使用。比方說,對於第一個標準來說,「以前的訂單」必須小於20,並且。 。 。如果沒有名字,第二個標準就很重要。它會是:

SELECT * FROM MyTable 
WHERE [email protected] 
And (MyTable.OrderCount > 19 Or col2 = @val2) 
And ((Not MyTable.FirstName Is Null) Or col3 = @val3) 

不要這樣想,「這個標準很重要,如果這種情況是真的」。所有重要的因素進入where子句。你必須瞭解Or/And/Not和操作順序。這需要練習才能獲得好處。如果你需要仔細考慮幾分鐘,不要擔心,有時候我們其他人也一樣。

+0

這不是sargable – 2010-01-06 17:23:27

+0

嗨thnx ...我不擅長的SQL語法,這可能聽起來很愚蠢,但我如何使用if語句,而不是我的condition1在SQL中? SELECT * FROM MyTable的 WHERE COL1 = @ VAL1 和(非條件1或者COL2 = @ VAL2) 和(非條件2或者COL3 = @ VAL3) – ajithmanmu 2010-01-06 17:35:52

+0

我想優化搜索是下一個步驟。我們對建議最佳策略的條件還是不夠了解,或者即使規模保證任何此類努力。 – 2010-01-06 19:51:40

0

我假設你打算有兩個不同的條件和col/val對,與你的文章中不一樣。

如果「條件」的東西,查詢的上下文中存在的(即不屬於外部因素),那麼你可以做這樣的事情:

SELECT * FROM MyTable 
WHERE col1 = @val1 
    AND (NOT condition1 OR (condition1 AND col2 = @val2)) 
    AND (NOT condition2 OR (condition2 AND col3 = @val3)) 

編輯:OK,所以「conditionX AND 「是多餘的,但我認爲這是一個很好的主意,因爲它明確了構造的意圖。

2

假設條件,可以寫成一個SQL表達式:

SELECT * FROM MyTable 
WHERE [email protected] AND 
(NOT(condition_1) OR col2 = @val2) AND 
(NOT(condition_2) OR col3 = @val3) 
0

人的人沒有關於SQL的線索,這些天... ...驚人

SELECT * 
FROM MyTable 
WHERE [email protected] 
and case when condition1 then col2 = @val2 else 1=1 end 
and case when condition2 then col3 = @val3 else 1=1 end 
+0

我發現WHERE子句中的CASE運行真的很糟糕當我嘗試 – gbn 2010-01-06 19:35:18

+0

這就是爲什麼你要評估一個案例,對於小數據集(少於500k行),對於較大的I建議,以編程方式處理。但速度有助於解決一個快速的問題是非常有用的。 – MCoelho 2010-01-07 03:28:17

+0

「這些天,人們對SQL沒有任何線索......令人驚歎......」粗魯無用。 – secretwep 2014-08-19 21:01:46

1

如果字段不可爲空(和don't criticise, try it

SELECT 
    * 
FROM 
    MyTable 
WHERE 
    col1 = @val1 AND 
    col2 = ISNULL(@val2, col2) AND 
    col3 = ISNULL(@val2, col3) 

否則(語句級別重新編譯,使得它的SQL Server 2005+上可以接受的)

if condition1 here 
    SELECT * FROM MyTable 
    WHERE [email protected] col2 = @val2 


if condition2 here 
    SELECT * FROM MyTable 
    WHERE [email protected] col3 = @val3 

else 
SELECT * FROM MyTable 
WHERE [email protected] 

或者使用其他的解決方案提供