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。实际上,我通常将
大小写
放在括号中(更容易阅读),并且总是将
用作列别名。