Funções lógicas – GREATEST (Transact-SQL)
Aplica-se a: SQL Server 2022 (16.x) Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric
Essa função retorna o valor máximo de uma lista de uma ou mais expressões.
Convenções de sintaxe de Transact-SQL
Sintaxe
GREATEST ( expression1 [ , ...expressionN ] )
Argumentos
expression1, expressionN
Uma lista de expressões separadas por vírgulas de qualquer tipo de dados comparável. A função GREATEST
requer pelo menos um argumento e não oferece suporte a mais de 254 argumentos.
Cada expressão pode ser uma constante, variável, nome de coluna ou função, e qualquer combinação de operadores aritméticos, bit a bit e de cadeia de caracteres. Funções de agregação e subconsultas escalares são permitidas.
Tipos de retorno
Retorna o tipo de dados com a precedência mais alta do conjunto de tipos transmitido à função. Para obter mais informações, confira Precedência de tipo de dados (Transact-SQL).
Se todos os argumentos tiverem o mesmo tipo de dados e o tipo tiver suporte para comparação, GREATEST
retornará esse tipo.
Caso contrário, a função converterá implicitamente todos os argumentos para o tipo de dados da precedência mais alta antes da comparação e o usará como o tipo de retorno.
Para tipos numéricos, a escala do tipo de retorno será igual ao argumento de precedência mais alta ou a maior escala se mais de um argumento for do tipo de dados de precedência mais alta.
Comentários
Todas as expressões na lista de argumentos devem ser de um tipo de dados comparável e poder ser convertidas implicitamente no tipo de dados do argumento com a precedência mais alta.
A conversão implícita de todos os argumentos para o tipo de dados de precedência mais alta ocorre antes da comparação.
Se a conversão implícita de tipo entre os argumentos não tiver suporte, a função falhará e retornará um erro.
Para obter mais informações sobre conversões implícitas e explícitas, confira Conversão de tipo de dados (Mecanismo de Banco de Dados).
Se um ou mais argumentos não forem NULL
, os argumentos NULL
serão ignorados durante a comparação. Se todos os argumentos forem NULL
, GREATEST
retornará NULL
.
A comparação de argumentos de caractere segue as regras de Precedência de ordenação (Transact-SQL).
Os seguintes tipos não são suportados para a comparação em GREATEST
: varchar(max), varbinary(max) ou nvarchar(max) excedendo 8.000 bytes, cursor, geometria, geografia, imagem, tipos definidos pelo usuário não ordenados por byte, ntext, table, text e xml.
Os tipos de dados varchar(max), varbinary(max) e nvarchar(max) são suportados para argumentos de 8.000 ou menos e serão convertidos implicitamente para varchar(n), varbinary(n) e nvarchar(n), respectivamente, antes da comparação.
Por exemplo, varchar(max) pode ter suporte até 8.000 caracteres se estiver usando um conjunto de caracteres de codificação de byte único, e nvarchar(max) pode ter suporte até 4.000 pares de bytes (assumindo a codificação de caracteres UTF-16).
Exemplos
a. Retornar o valor máximo de uma lista de constantes
O exemplo a seguir retorna o valor máximo da lista de constantes fornecida.
A escala do tipo de retorno é determinada pela escala do argumento com o tipo de dados de precedência mais alta.
SELECT GREATEST('6.62', 3.1415, N'7') AS GreatestVal;
GO
Veja a seguir o conjunto de resultados.
GreatestVal
--------
7.0000
(1 rows affected)
B. Retornar o valor máximo de uma lista de constantes de caracteres
O exemplo a seguir retorna o valor máximo da lista de constantes de caracteres fornecida.
SELECT GREATEST('Glacier', N'Joshua Tree', 'Mount Rainier') AS GreatestString;
GO
Veja a seguir o conjunto de resultados.
GreatestString
-------------
Mount Rainier
(1 rows affected)
C. Retornar o valor máximo de uma lista de argumentos da coluna
Este exemplo retorna o valor máximo de uma lista de argumentos de coluna e ignora os valores NULL
durante a comparação. Este exemplo usa o banco de dados AdventureWorksLT
, que pode ser instalado rapidamente como banco de dados de exemplo para um novo Banco de Dados SQL do Azure. Para obter mais informações, consulte os Bancos de dados de exemplo do 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;
Veja a seguir o conjunto de resultados. LatestDate
escolhe o maior valor de data dos três valores, ignorando 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. Usar GREATEST
com variáveis locais
Este exemplo usa GREATEST
para determinar o valor máximo de uma lista de variáveis locais dentro do predicado de uma cláusula 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
Veja a seguir o conjunto de resultados. Somente valores maiores que 0,7 são exibidos.
VarX Correlation
---------- -----------
Var2 .825
(1 rows affected)
E. Usar GREATEST
com colunas, constantes e variáveis
Este exemplo usa GREATEST
para determinar o valor máximo de uma lista mista que inclui colunas, constantes e variáveis.
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
Veja a seguir o conjunto de resultados.
VarX Correlation GreatestVar
---------- --------------------- ---------------------
Var1 0.200 0.590
Var2 0.825 0.825
Var3 0.610 0.610
(3 rows affected)