Разрешить повторяющиеся совпадения для оператора CASE - PullRequest
0 голосов
/ 31 июля 2011

Как я могу показать все значения MatchID, которые совпадают в этом операторе WHERE 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 голосов
/ 31 июля 2011

Вероятно, есть более элегантный способ сделать то, что вы просите, но вот одно из возможных решений:

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%'

РЕДАКТИРОВАТЬ : если производительность представляет собой серьезную проблему, вы также можетерассмотреть гибридный подход;используйте один SELECT с оператором CASE для a% и b% , а затем UNION, что с другим SELECT для второго a% .

0 голосов
/ 01 августа 2011

Я думаю, что это также должно работать.

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`  
...