2015-02-26 5 views
0

У меня есть следующий запрос:Перекрытие условие для случая-когда

SELECT case  
when tbl.id % 2 = 0 then 'mod-2' 
when tbl.id % 3 = 0 then 'mod-3' 
when tbl.id % 5 = 0 then 'mod-5' 
else 'mod-x' 
end as odds, tbl.id from some_xyz_table tbl; 

Если таблица Id 5,6,7 затем она возвращается на выход как (копируется из пг-администратора):

"mod-5";5 
"mod-2";6 
"mod-x";7 

Но , здесь я вижу, что 6 делится на 2 и 3. И мой ожидаемый результат:

"mod-5";5 
"mod-2";6 
"mod-3";6 <-- this 
"mod-x";7 

Есть ли способ изменить этот запрос, чтобы получить такой вывод? Любое альтернативное решение сделает для меня.

+0

Итак, вы хотите, чтобы получить 4 строки из таблицы, которая содержит только три строки? –

+0

@a_horse_with_no_name да. Не уверен, возможно ли это или нет. Просто попробуйте мою удачу. –

ответ

0

Вы можете сделать это с помощью UNION запросов [EDIT изменил его использовать UNION ALL]:

SELECT 'mod-5', id FROM tbl -- divisible by 5 
WHERE id %5 = 0 
UNION ALL 
SELECT 'mod-2', id FROM tbl -- divisible by 2 
WHERE id %2 = 0 
UNION ALL 
SELECT 'mod-3', id FROM tbl -- divisible by 3 
WHERE id %3 = 0 
UNION ALL 
SELECT 'mod-x',id FROM tbl -- not divisible by 5,3 or 2 
WHERE id %5 <> 0 AND id%2 <> 0 AND id % 3 <> 0 
+0

Вы должны использовать 'union all' вместо' union' –

+0

@a_horse_with_no_name Ну, не будет дубликатов - это потому, что объединение все более эффективно? Изменено, во всяком случае ... – mlinth