MySql案例什么时候需要在哪里呢?
我写了这个查询:MySql案例什么时候需要在哪里呢?,mysql,sql,case,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”列返回正确,问题是查询返回所有行,而不仅仅是其中一个案例与colb匹配的行! 如何使其仅返回匹配的行 我需要添加一个WHERE?但我总是看到这种语法没有它。谢谢模式: drop table
SELECT cola, colb, colc, CASE colb
WHEN '6kHcnevOJOSU' THEN 0
WHEN 'g45ujP0td6nw' THEN 1
WHEN 'v83f15lALyFs' THEN 2
END AS sor FROM mytable
“sor”列返回正确,问题是查询返回所有行,而不仅仅是其中一个案例与colb匹配的行!
如何使其仅返回匹配的行
我需要添加一个WHERE?但我总是看到这种语法没有它。谢谢模式:
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
的使用 只需添加一个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);
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;
或者,您可以使用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
WHERE colc IN (0, 1, 2);
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;
是的,如果要过滤结果,需要一个
where
子句。对于不匹配的记录,当前查询将返回最后一列的null
值。第二列似乎很完美!我看到你被父母取代了,有什么区别吗?@Jackt。实际上,我通常将大小写
放在括号中(更容易阅读),并且总是将用作列别名。