需求描述:
在
chaos(id,v1,v2,v3)
表中获取每个 id 对应的 v1、v2、v3 字段的最大值,v1、v2、v3 同为数值类型。
chaos 表的数据 >>>
id v1 v2 v3
------ ------ ------ --------
1 100 80 102
2 2 -20 -1
3 999 12 111
4 1234 2222 -123
5 871 888 666
6 -210 9 1024
7 0 -1 0
8 2 2 2
要查询的结果 >>>
id v_max
------ --------
1 102
2 2
3 999
4 2222
5 888
6 1024
7 0
8 2
熟悉
MySQL
的函数的朋友,应该想得到,使用
GREATEST()
函数就能完成这个需求。
SELECT
GREATEST(v1, v2, v3) AS v_max
chaos
是不是太简单了点?是的,确实如此。
如果没有
GREATEST()
函数呢?可以试试用嵌套的 IF 语句实现。
SELECT
IF(v1 > v2, v1, v2) > v3,
IF(v1 > v2, v1, v2),
) AS v_max
chaos
表达式
IF(v1 > v2, v1, v2)
是要求得在 v1、v2 之间较大的那个值,再用求得的值和 v3 作比较。也可以把嵌套的 IF 语句看成是下面这两个 IF 语句的组合。
v12 = IF(v1 > v2, v1, v2)
v_max = IF(v12 > v3, v12, v3)
如果 chaos 再增加两个数值列 v4、v5,要同时比较这五个字段的值,嵌套的 IF 语句将变得异常复杂,且难以理解。
那么,有没有比较简单且通用的实现呢?
有。先使用
UNION ALL
把每个字段的值合并在一起,再根据 id 分组求得最大值。
WITH chaos_union AS
(SELECT
v1 AS v
chaos
UNION ALL
SELECT
v2 AS v
chaos
UNION ALL
SELECT
v3 AS v
chaos)
SELECT