GREATEST()

GREATEST(value1, value2, …) 返回参数列表中的最大值(至少两个参数)。混合数值类型会隐式提升为公共类型后再比较。若任一参数为 NULL,则结果返回 NULL。

函数说明

GREATEST() 返回参数列表中的最大值。它比较两个或更多值并返回其中最大的值。

自 v4.1.0 起,GREATEST() 会对混合数值参数类型进行隐式类型提升,而不是直接拒绝。例如,将 BIGINTDOUBLE 进行比较时,两者会自动提升为 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;