逻辑函数 - GREATEST (Transact-SQL)
适用于: sql Server 2022 (16.x) Azure SQL 数据库 Azure SQL 托管实例 Microsoft Fabric Warehouse Microsoft Fabric Warehouse 中的 Azure Synapse Analytics SQL 分析终结点
此函数返回一个或多个表达式列表中的最大值。
语法
GREATEST ( expression1 [ , ...expressionN ] )
参数
expression1, expressionN
任何可比较数据类型的逗号分隔表达式列表。 GREATEST
函数需要至少一个参数并且支持不超过 254 个参数。
每个表达式可以是常数、变量、列名、函数以及算术运算符、位运算符和字符串运算符的任意组合。 允许使用聚合函数和标量子查询。
返回类型
从传递到函数的类型集中返回优先级最高的数据类型。 有关详细信息,请参阅数据类型优先级 (Transact-SQL)。
如果所有参数都具有相同的数据类型,并且该类型支持比较,GREATEST
将返回该类型。
否则,该函数会在比较之前将所有参数隐式转换为最高优先级的数据类型,并使用此类型作为返回类型。
对于数值类型,返回类型的小数位数将与最高优先级参数相同;或者,如果多个参数是最高优先级的数据类型,则返回最高位。
注解
参数列表中的所有表达式都必须是可比较并且可隐式转换为具有最高优先级的参数的数据类型。
在比较之前,将所有参数隐式转换为最高优先级的数据类型。
如果参数之间的隐式类型转换不受支持,函数将失败并返回错误。
有关隐式和显式转换的详细信息,请参阅数据类型转换(数据库引擎)。
如果一个或多个参数不为 NULL
,比较过程中将忽略 NULL
参数。 如果所有参数都为 NULL
,GREATEST
将返回 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)