我写了这个查询:
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?但我总是在没有它的情况下看到这种语法感谢
答案 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;