2011-07-31 64 views
0

重複的比賽我怎麼能證明在這個WHERE CASE語句匹配MatchID的所有值:允許CASE語句

SELECT 
    `Word`, 
    CASE 
     WHEN `Word` LIKE 'a%' THEN 12 
     WHEN `Word` LIKE 'b%' THEN 13 
     WHEN `Word` LIKE 'a%' THEN 14 
     ELSE -1 
    END AS MatchID 
FROM `Words` 

我的表中包含A,B和C,讓我們說。現在,該表的結果僅顯示:

a 12 
b 13 

我希望它也顯示:

a 14 

換句話說,我希望CASE子句來顯示所有的比賽,而不僅僅是第一場比賽。有任何想法嗎?

謝謝!

+2

這意味着你想要一行產生2行:這是沒有意義的。 CASE評估*每行一次*短路:你有一個「a」行,所以你得到12.一行不能爲單個SELECT做2行。您評論時,聯盟會增加很多開銷。那麼,你想解決的實際問題是什麼......? – gbn

回答

2

有可能是一個更優雅的方式做你問什麼,但這裏有一個可能的解決方案:

SELECT `Word`, 12 AS MatchID FROM `Words` WHERE `Word` like 'a%' 
UNION 
SELECT `Word`, 13 AS MatchID FROM `Words` WHERE `Word` like 'b%' 
UNION 
SELECT `Word`, 14 AS MatchID FROM `Words` WHERE `Word` like 'a%' 

編輯:如果性能是一個大的關注,那麼你也可以考慮一種混合的方法;使用一個帶有CASE語句的SELECT爲a%b%,然後UNION與另一個SELECT爲第二個a%

+0

用你的方法,MySQL需要通過表格過濾三次,對吧?你認爲這比通過一次過濾慢三次檢查每個單詞慢得多,就像我在做什麼一樣? – carlbenson

+2

@Carl,您的示例數據對我們來說毫無意義,但我的印象是您應該重新考慮完整的查詢。根據你寫的規格,這是基本上唯一的方法。 –

+0

經歷過三次表肯定比經歷過一次慢;但是,我知道沒有其他方法可以在一個查詢中對單個行進行多次計數。如果您的「單詞」列正確編入搜索索引,那麼性能影響應該很小。 – ean5533

0

我認爲這也應該工作。

SELECT `Word`, 
     COALESCE(`MatchID`, -1) AS `MatchID` 
FROM `Words` 
     LEFT JOIN (SELECT 'a%' AS `Match`, 12 AS `MatchID` 
        UNION ALL 
        SELECT 'b%' AS `Match`, 13 AS `MatchID` 
        UNION ALL 
        SELECT 'a%' AS `Match`, 14 AS `MatchID`) AS `Matches` 
     ON `Words`.`Word` LIKE `Matches`.`Match`