2010-02-14 86 views
2

這是一個理論問題,我想知道是否有一個很好的方法來找出匹配的WHERE語句中的哪個條件。SQL:標記哪些條件匹配

說我有這樣的查詢:

SELECT * FROM table WHERE 
    COND1 OR 
    (COND2 AND COND3) OR 
    COND4 

有知道哪些條件做了一個給定的行匹配(或失配)的方法嗎?


一種解決方案我想的是加入CASE子句,到SELECT,並重新運行所有的WHERE條件爲該行:

SELECT *, which_cond = CASE .... END CASE ... 

回答

3

CASE是一種可能性。但更短的寫會IF()(與MySQL至少):

SELECT *, IF(COND2, 1, 0) AS cond2, IF(COND3, 1, 0) as cond3 ... 

cond*匹配的,如果它的值是1

當然,檢查COND1是否匹配沒有意義。對於你回來的所有結果,COND1是正確的。所以IF(COND1, 1, 0)將永遠返回1(在你的例子中)。

更新
再次至少爲MySQL,我發現,那下面就足夠了,如果你只是想獲得任意10的結果是:

SELECT *, COND2 AS cond2, COND3 as cond3 ... 

,並且相對於馬克的回答,你能避免寫條件的兩倍,如果使用HAVING代替WHEREHAVING機會獲得別名):

SELECT *, COND2 AS cond2, COND3 as cond3 
FROM table 
HAVING COND1 AND (cond2 OR cond3) 

(注:大寫字母表示的實際情況表達和小寫的是別名)

更新2:

那麼它的變化並不多:你只需要檢查通過OR連接條件在您的更新版本中,檢查COND2是否爲真即可。如果是這樣,那麼COND3也是如此,反之亦然。

SELECT *, COND1 AS cond1, COND2 as cond2, COND4 as cond4 
FROM table 
HAVING cond1 OR (cond2 AND COND3) OR cond4 

我認爲這一點很清楚。

+0

這是一個有趣的解決方案 – Amirshk 2010-02-14 12:18:54

+0

是啊,就像我說的,更多的是理論問題... – Amirshk 2010-02-14 12:22:06

+0

+1:「檢查COND1是否匹配沒有意義」有關查詢的推理比黑客周圍更有幫助。針對COND1 AND COND2以及COND1和COND3運行兩個單獨的查詢,您將學到很多。 – 2010-02-14 12:22:38

1

你的方法有效,但它需要你輸出所有條件兩次,如果它們是複雜的表達式,可能會令人討厭。當條件需要改變時,代碼的複製也會導致錯誤,並且忘記更新這兩個地方。我建議,而不是使用子查詢評估的條件,也比使用從那裏別名:

SELECT *, 
     CASE WHEN Cond1 AND Cond2 THEN 'Foo' 
      ELSE 'Bar' 
     END AS WhichCondition 
FROM (SELECT *, 
      (...SQL FOR COND1...) AS Cond1, 
      (...SQL FOR COND2...) AS Cond2, 
      (...SQL FOR COND3...) AS Cond3 
      FROM table) AS T1 
WHERE Cond1 AND (Cond2 OR Cond3) 

在SQL Server和Oracle,你可以使用一個CTE,而不是一個子查詢。我沒有這樣做,因爲你也使用了MySql標籤。

+0

@Mark你是否可以添加CTE解決方案,mysql標籤是有原因的,因爲我想知道不同的引擎是否有一些內置的解決方案 – Amirshk 2010-02-14 12:28:35