2016-07-23 1 views
3

Я написал этот вопрос:MySql CASE КОГДА ЧТО ИМЕЕТ ГДЕ?

SELECT cola, colb, colc, CASE colb 
WHEN '6kHcnevOJOSU' THEN 0 
WHEN 'g45ujP0td6nw' THEN 1 
WHEN 'v83f15lALyFs' THEN 2 
END AS sor FROM mytable 

Столбец «сор» возвращается правильно, то проблема заключается в том, что запрос возвращает все строки, а не только те, где один из colb случаев матча! Как я могу заставить его возвращать только совпадающие строки?

Нужно ли добавить ГДЕ? Но я всегда видел этот синтаксис без него. Благодарности

+0

Да, вам нужен 'where' пункт, если вы хотите, чтобы отфильтровать результаты. Ваш текущий запрос вернет значения «null» для последнего столбца для записей, которые не совпадают. – sgeddes

ответ

1

Просто добавьте пункт where:

SELECT cola, colb, colc, 
     (CASE colb WHEN '6kHcnevOJOSU' THEN 0 
        WHEN 'g45ujP0td6nw' THEN 1 
        WHEN 'v83f15lALyFs' THEN 2 
     END) as sor 
FROM mytable t 
WHERE colc IN (0, 1, 2); 

В качестве альтернативы, вы можете использовать having пункт:

SELECT cola, colb, colc, 
     (CASE colb WHEN '6kHcnevOJOSU' THEN 0 
        WHEN 'g45ujP0td6nw' THEN 1 
        WHEN 'v83f15lALyFs' THEN 2 
     END) as sor 
FROM mytable t 
HAVING sor IS NOT NULL; 
+0

Второй кажется идеальным! Я вижу, что вы заменили AS родительским поведением, какую-то разницу? – Jackt

+0

@Jackt. , , Фактически, я обычно помещаю 'CASE' в круглые скобки (проще читать) и всегда использую' as' для псевдонимов столбцов. –

+0

Спасибо! _______ – Jackt

1

схемы:

drop table if exists mytable; 
create table mytable 
( id int auto_increment primary key, 
    cola int not null, 
    colb varchar(20) not null, 
    colc int not null 
); 
insert mytable (cola,colb,colc) values 
(9,'6kHcnevOJOSU',1), 
(3,'v83f15lALyFs',1), 
(9,'frog',1), 
(3,'g45ujP0td6nw',1); 

Вариант 1:

SELECT cola, colb, colc, CASE colb 
WHEN '6kHcnevOJOSU' THEN 0 
WHEN 'g45ujP0td6nw' THEN 1 
WHEN 'v83f15lALyFs' THEN 2 
END AS sor FROM mytable 
where colb in ('6kHcnevOJOSU','g45ujP0td6nw','v83f15lALyFs'); 

Вариант 2:

select cola,colb,colc,sor 
from 
( SELECT cola, colb, colc, CASE colb 
    WHEN '6kHcnevOJOSU' THEN 0 
    WHEN 'g45ujP0td6nw' THEN 1 
    WHEN 'v83f15lALyFs' THEN 2 
    END AS sor FROM mytable 
) xDerived 
where sor is not null; 

Результаты:

+------+--------------+------+------+ 
| cola | colb   | colc | sor | 
+------+--------------+------+------+ 
| 9 | 6kHcnevOJOSU | 1 | 0 | 
| 3 | v83f15lALyFs | 1 | 2 | 
| 3 | g45ujP0td6nw | 1 | 1 | 
+------+--------------+------+------+ 

В Варианте 1 sor пока недоступен в предложении where.

В варианте 2 производная таблица xDerived очищает использование sor внешней оболочкой.

+1

Спасибо! _______ – Jackt