MySql案例,那么那里也需要吗?

时间:2016-07-23 01:46:54

标签: mysql sql case

我写了这个查询:

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

'sor'列被正确返回,问题是查询返回所有行,而不仅仅是其中一个case匹配colb的行! 我怎样才能让它只返回匹配的行?

我是否需要添加WHERE?但我总是在没有它的情况下看到这种语法感谢

2 个答案:

答案 0 :(得分: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 :(得分: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;