2011-07-31 62 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`