GREATEST()¶
GREATEST(value1, value2, …) 返回参数列表中的最大值(至少两个参数)。混合数值类型会隐式提升为公共类型后再比较。若任一参数为 NULL,则结果返回 NULL。
函数说明¶
GREATEST() 返回参数列表中的最大值。它比较两个或更多值并返回其中最大的值。
自 v4.1.0 起,GREATEST() 会对混合数值参数类型进行隐式类型提升,而不是直接拒绝。例如,将 BIGINT 与 DOUBLE 进行比较时,两者会自动提升为 DOUBLE 后再比较。
当任一参数为 NULL 时,函数返回 NULL,与 MySQL 行为一致。
Syntax¶
> GREATEST(value1, value2, ...)
Arguments¶
Arguments |
Description |
|---|---|
value1, value2, … |
必选。两个或更多待比较的值。支持的类型包括整数、浮点数、小数、字符串和时间类型。 |
类型提升规则¶
当参数具有不同的数值类型时,GREATEST() 会将它们提升到最宽泛的公共类型:
TINYINT+INT提升为INT(或更宽的整数类型)。BIGINT+DOUBLE提升为DOUBLE。BIGINT+DECIMAL提升为适当精度的DECIMAL。有符号
BIGINT+ 超出INT64范围的无符号BIGINT UNSIGNED提升为DECIMAL128(无损)。不同精度的小数提升到更宽的精度/标度。
全部无符号的参数提升到最宽的无符号类型。
同类型比较不触发提升。
Examples¶
DROP DATABASE IF EXISTS dbfuncs;
CREATE DATABASE dbfuncs;
USE dbfuncs;
-- 基本比较
SELECT GREATEST(1, 2.0) AS result;
-- result: 2.0
-- 混合整数与浮点类型
SELECT GREATEST(CAST(1 AS BIGINT), CAST(2.0 AS DOUBLE)) AS result;
-- result: 2.0
SELECT GREATEST(CAST(5 AS BIGINT), CAST(2.5 AS DECIMAL(10,2))) AS result;
-- result: 5.00
-- 不同宽度整数类型
SELECT GREATEST(CAST(1 AS TINYINT), CAST(2000 AS INT)) AS result;
-- result: 2000
-- 同类型回归验证
SELECT GREATEST(CAST(1 AS BIGINT), CAST(2 AS BIGINT)) AS result;
-- result: 2
SELECT GREATEST(CAST(1.0 AS DOUBLE), CAST(2.0 AS DOUBLE)) AS result;
-- result: 2.0
-- NULL 处理:任一参数为 NULL 时结果即为 NULL
SELECT GREATEST(1, NULL, 2.0) AS result;
-- result: NULL
-- 表驱动:聚合函数比较(BIGINT vs DOUBLE)
CREATE TABLE toll_transactions(id INT, gate_processing_sec DOUBLE, lanes INT);
INSERT INTO toll_transactions VALUES
(1, 3.5, 2), (2, 7.0, 2), (3, 1.0, 4), (4, 12.5, 3);
SELECT GREATEST(COUNT(*), AVG(gate_processing_sec)) AS result FROM toll_transactions;
-- result: 6.0
-- 逐行混合列类型比较
CREATE TABLE mixed_num(a BIGINT, b DOUBLE, c DECIMAL(20,4));
INSERT INTO mixed_num VALUES (10, 2.5, 7.25), (3, 9.0, 4.5), (-5, -1.0, 100.0);
SELECT a, b, GREATEST(a, b) AS gab FROM mixed_num ORDER BY a;
SELECT a, b, c, GREATEST(a, b, c) AS g3 FROM mixed_num ORDER BY a;
-- 无符号整数比较
CREATE TABLE uns(u1 TINYINT UNSIGNED, u2 INT UNSIGNED, u3 BIGINT UNSIGNED);
INSERT INTO uns VALUES (1, 300, 5000000000), (200, 50, 1), (100, 70000, 9000000000);
SELECT GREATEST(u1, u2) AS g_u FROM uns ORDER BY u1;
SELECT GREATEST(u1, u2, u3) AS g3u FROM uns ORDER BY u1;
-- 有符号 + 超出 int64 范围的无符号,提升为 decimal128
SELECT GREATEST(CAST(-3 AS BIGINT), CAST(9000000000000000000 AS BIGINT UNSIGNED)) AS result;
-- result: 9000000000000000000
DROP DATABASE dbfuncs;