逻辑函数 - GREATEST (Transact-SQL)

适用于:SQL Server 2022 (16.x) Azure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

此函数返回一个或多个表达式列表中的最大值。

Transact-SQL 语法约定

语法

GREATEST ( expression1 [ , ...expressionN ] )

参数

expression1, expressionN

任何可比较数据类型的逗号分隔表达式列表。 GREATEST 函数需要至少一个参数并且支持不超过 254 个参数。

每个表达式可以是常数、变量、列名、函数以及算术运算符、位运算符和字符串运算符的任意组合。 允许使用聚合函数和标量子查询。

返回类型

从传递到函数的类型集中返回优先级最高的数据类型。 有关详细信息,请参阅数据类型优先级 (Transact-SQL)

如果所有参数都具有相同的数据类型,并且该类型支持比较,GREATEST 将返回该类型。

否则,该函数会在比较之前将所有参数隐式转换为最高优先级的数据类型,并使用此类型作为返回类型。

对于数值类型,返回类型的小数位数将与最高优先级参数相同;或者,如果多个参数是最高优先级的数据类型,则返回最高位。

注解

参数列表中的所有表达式都必须是可比较并且可隐式转换为具有最高优先级的参数的数据类型。

在比较之前,将所有参数隐式转换为最高优先级的数据类型。

如果参数之间的隐式类型转换不受支持,函数将失败并返回错误。

有关隐式和显式转换的详细信息,请参阅数据类型转换(数据库引擎)

如果一个或多个参数不为 NULL,比较过程中将忽略 NULL 参数。 如果所有参数都为 NULLGREATEST 将返回 NULL

字符参数的比较遵循排序规则优先级 (Transact-SQL) 规则。

以下类型不支持在 GREATEST 中进行比较:超过 8,000 字节的 varchar(max)、varbinary(max) 或 nvarchar(max)、游标、几何、地理、图像、非字节排序的用户定义类型、ntext、表、文本和 xml。

8,000 字节或以下的参数支持使用 varchar(max)、varbinary(max) 和 nvarchar(max) 数据类型,它们在比较前分别会被隐式转换为 varchar(n)、varbinary(n) 和 nvarchar(n)。

例如,如果使用单字节编码字符集,则 varchar(max) 最多可支持 8,000 个字符,而 nvarchar(max) 最多支持 4,000 个字节对(假定采用 UTF-16 字符编码)。

示例

A. 从常数列表中返回最大值

下面的示例会返回所提供常数列表中的最大值。

返回类型的小数位数由优先级最高的参数的小数位数决定。

SELECT GREATEST('6.62', 3.1415, N'7') AS GreatestVal;
GO

下面是结果集:

GreatestVal
--------
  7.0000

(1 rows affected)

B. 从字符常数列表中返回最大值

下面的示例会返回所提供字符常数列表中的最大值。

SELECT GREATEST('Glacier', N'Joshua Tree', 'Mount Rainier') AS GreatestString;
GO

下面是结果集。

GreatestString
-------------
Mount Rainier

(1 rows affected)

C. 从列参数列表中返回最大值

此示例会返回列参数列表中的最大值,并且会在比较过程中忽略 NULL 值。 此示例使用 AdventureWorksLT 数据库,该数据库可以快速安装为新 Azure SQL 数据库的示例数据库。 有关详细信息,请参阅 AdventureWorks sample databases(AdventureWorks 示例数据库)。

SELECT P.Name,
    P.SellStartDate,
    P.DiscontinuedDate,
    PM.ModifiedDate AS ModelModifiedDate,
    GREATEST(P.SellStartDate, P.DiscontinuedDate, PM.ModifiedDate) AS LatestDate
FROM SalesLT.Product AS P
INNER JOIN SalesLT.ProductModel AS PM
    ON P.ProductModelID = PM.ProductModelID
WHERE GREATEST(P.SellStartDate, P.DiscontinuedDate, PM.ModifiedDate) >= '2007-01-01'
    AND P.SellStartDate >= '2007-01-01'
    AND P.Name LIKE 'Touring %'
ORDER BY P.Name;

下面是结果集。 LatestDate 选择三个值的最大日期值,并忽略 NULL

Name                 SellStartDate           DiscontinuedDate    ModelModifiedDate       LatestDate
-------------------- ----------------------- ------------------- ----------------------- -----------------------
Touring Pedal        2007-07-01 00:00:00.000 NULL                2009-05-16 16:34:29.027 2009-05-16 16:34:29.027
Touring Tire         2007-07-01 00:00:00.000 NULL                2007-06-01 00:00:00.000 2007-07-01 00:00:00.000
Touring Tire Tube    2007-07-01 00:00:00.000 NULL                2007-06-01 00:00:00.000 2007-07-01 00:00:00.000

(3 rows affected)

D. 将 GREATEST 用于局部变量

此示例使用 GREATEST 确定 WHERE 子句谓词中局部变量列表的最大值。

CREATE TABLE dbo.Studies (
    VarX VARCHAR(10) NOT NULL,
    Correlation DECIMAL(4, 3) NULL
    );

INSERT INTO dbo.Studies
VALUES ('Var1', 0.2),
    ('Var2', 0.825),
    ('Var3', 0.61);
GO

DECLARE @PredictionA DECIMAL(2, 1) = 0.7;
DECLARE @PredictionB DECIMAL(3, 1) = 0.65;

SELECT VarX,
    Correlation
FROM dbo.Studies
WHERE Correlation > GREATEST(@PredictionA, @PredictionB);
GO

下面是结果集。 只显示大于 0.7 的值。

VarX       Correlation
---------- -----------
Var2              .825

(1 rows affected)

E. 将 GREATEST 用于列、常数和变量

此示例使用 GREATEST 确定包含列、常数和变量的混合列表的最大值。

CREATE TABLE dbo.Studies (
    VarX VARCHAR(10) NOT NULL,
    Correlation DECIMAL(4, 3) NULL
    );

INSERT INTO dbo.Studies
VALUES ('Var1', 0.2),
    ('Var2', 0.825),
    ('Var3', 0.61);
GO

DECLARE @VarX DECIMAL(4, 3) = 0.59;

SELECT VarX,
    Correlation,
    GREATEST(Correlation, 0, @VarX) AS GreatestVar
FROM dbo.Studies;
GO

下面是结果集。

VarX       Correlation           GreatestVar
---------- --------------------- ---------------------
Var1       0.200                 0.590
Var2       0.825                 0.825
Var3       0.610                 0.610

(3 rows affected)

后续步骤