mysql - 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() 忽略空值?
解决方案
MAX()
忽略空值,并选择否则看到的最大值。由于'x'
大于'o'
,如果两个值都存在,则结果为'x'
。
例如对于 Bob,由于有 2 条记录具有不同的course
值,因此至少有一条记录会命中else
子句。这意味着对于所有 3 个,至少'x'
存在一个,因此结果是'x'
所有 3 个。
基本上,第一个版本是:“如果WHEN
子句对任何记录为真,则结果为'o'
,否则结果为NULL
。”
第二个版本是:“如果任何记录的WHEN
子句为假,则结果为,因为这是最高值,否则结果为。” 或者换一种说法:“如果子句对所有记录都为真,则结果为,否则结果为。”'x'
'o'
WHEN
'o'
'x'
推荐阅读
- javascript - 有一个按钮来控制时间线 GSAP 动态定位增量计数器
- python - Selenium 找不到链接的元素
- docker - 当 env 中未设置变量时,docker-compose 在随机端口上公开
- java - Bouncy Castle - 如何从 JceOpenSSLPKCS8DecryptorProviderBuilder 获取公钥信息
- bash - grep 文件列表中的最后一个匹配项
- javascript - 一步一步匹配句子的正则表达式
- php - 未定义变量:posts(查看:/home/.../annonces/resources/views/welcome.blade.php)
- apache-spark - 将多列映射到 Spark 数据框中的单个键
- requiredfieldvalidator - 用于验证文本框条目的 Javascript 代码
- ios - 如何在 Swift 中导航共享扩展以托管应用程序?