Логические функции — GREATEST (Transact-SQL)
Область применения: SQL Server 2022 (16.x) База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL Azure Synapse Analytics в хранилище Microsoft Fabric в Microsoft Fabric
Эта функция возвращает максимальное значение из списка, содержащего одно или несколько выражений.
Соглашения о синтаксисе Transact-SQL
Синтаксис
GREATEST ( expression1 [ , ...expressionN ] )
Аргументы
expression1, expressionN
Список выражений любого сопоставимого типа данных, разделенный запятыми. Функция GREATEST
требует по меньшей мере один аргумент, но не более 254 аргументов.
Каждое выражение может быть константой, переменной, именем столбца или функцией, а также любым сочетанием арифметических, битовых и строковых операторов. Допускаются агрегатные функции и скалярные вложенные запросы.
Типы возвращаемых данных
Возвращает тип данных с наивысшим приоритетом из переданного функции набора типов. Дополнительные сведения см. в разделе Приоритет типов данных (Transact-SQL).
Если все аргументы имеют одинаковый тип данных и тип поддерживается для сравнения, GREATEST
возвращает этот тип.
В противном случае функция перед сравнением неявно приводит все аргументы к типу данных с наивысшим приоритетом и использует его как тип возвращаемого значения.
Для числовых типов масштаб типа возвращаемого значения будет соответствовать масштабу аргумента, имеющего тип данных с наивысшим приоритетом, либо наибольшему масштабу, если таких аргументов несколько.
Замечания
Все выражения в списке аргументов должны иметь сопоставимый тип данных, который может быть неявно преобразован в тип аргумента с наивысшим приоритетом.
Перед сравнением выполняется неявное приведение всех аргументов к типу данных с наивысшим приоритетом.
Если неявное преобразование типов между аргументами не поддерживается, функция завершится ошибкой и возвращает ошибку.
Дополнительные сведения о явном и неявном преобразовании см. в статье Преобразование типов данных (ядро СУБД).
Если один или несколько аргументов не NULL
являются, NULL
то аргументы игнорируются во время сравнения. Если все аргументы являютсяNULL
, возвращаетсяNULL
GREATEST
.
Сравнение символьных аргументов осуществляется в соответствии с правилами, приведенными в статье Очередность параметров сортировки.
Для сравнения не поддерживаются следующие типы: varchar(max),varbinary(max) или nvarchar(max) превышающие 8000 байт, курсор, геометрия, география, география, изображение, неупорядоченные пользователем типы, ntext, table, text и xml. GREATEST
Типы данных varchar(max), varbinary(max)и nvarchar(max) поддерживаются для аргументов, 8000 байт или меньше, и будут неявно преобразованы в varchar(n), varbinary(n)и nvarchar(n), соответственно, перед сравнением.
Например, varchar(max) может поддерживать до 8000 символов, если используется набор символов с одним байтом, а nvarchar(max) может поддерживать до 4000 байт-пар (при условии кодировки символов UTF-16).
Примеры
А. Возвращает максимальное значение из списка констант
В следующем примере возвращается максимальное значение из указанного списка констант.
Масштаб типа возвращаемого значения определяется масштабом аргумента с типом данных, имеющим наивысший приоритет.
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
, которую можно быстро установить в качестве образца базы данных для нового экземпляра Базы данных SQL Azure. Дополнительные сведения см. в разделе Образцы баз данных 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)
Е. Использование 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)