首页 > 解决方案 > MySQL-这两个sql有什么区别?CASE WHEN in MAX(),一个用null,一个用字符

问题描述

数据来源如下:

name    course
---------------
Marry   UNIX
Bob     Java
Bob     SQL
Cherry  SQL
John    SQL
John    UNIX
Eric    SQL

这个sql是正确的:

 SELECT  name,
    max(CASE WHEN course = 'SQL' THEN '○' ELSE null END) AS "SQL",
    max(CASE WHEN course = 'UNIX' THEN '○' ELSE null END) AS "UNIX",
    max(CASE WHEN course = 'Java' THEN '○' ELSE null END) AS "Java"
 FROM Courses
 GROUP BY name;

但这是错误的:

 SELECT  name,
    max(CASE WHEN course = 'SQL' THEN '○' ELSE 'x' END) AS "SQL",
    max(CASE WHEN course = 'UNIX' THEN '○' ELSE 'x' END) AS "UNIX",
    max(CASE WHEN course = 'Java' THEN '○' ELSE 'x' END) AS "Java"
 FROM Courses
 GROUP BY name;

我在 MySQL 中运行了第二个,结果是错误的

    name    SQL   UNIX   JAVA
    Bob     x      x      x
    Cherry  ○      x      x
    Eric    ○      x      x
    John    x      x      x
    Marry   x      ○      x

那么这两个sql之间有什么问题?MAX() 忽略空值?

标签: mysqlsql

解决方案


MAX()忽略空值,并选择否则看到的最大值。由于'x'大于'o',如果两个值都存在,则结果为'x'

例如对于 Bob,由于有 2 条记录具有不同的course值,因此至少有一条记录会命中else子句。这意味着对于所有 3 个,至少'x'存在一个,因此结果是'x'所有 3 个。

基本上,第一个版本是:“如果WHEN子句对任何记录为真,则结果为'o',否则结果为NULL。”

第二个版本是:“如果任何记录的WHEN子句为假,则结果为,因为这是最高值,否则结果为。” 或者换一种说法:“如果子句对所有记录都为真,则结果为,否则结果为。”'x''o'WHEN'o''x'


推荐阅读