Fala pessoal!!
Nesse post eu gostaria de trazer uma novidade que já está disponível no Azure SQL Database e acredito que em breve, já estará disponível no SQL Server On-premises também, que são as “novas” (Para quem já trabalha com outros bancos, essa função é bem conhecida e está disponível há muitos anos) funções GREATEST e LEAST, que tem o objetivo de retornar o maior ou o menor valor entre uma lista de valores ou colunas diferentes.
Não vi documentação ainda sobre isso, e nem nenhum conteúdo em português e resolvi compartilhar essa novidade e também mostrar como vai funcionar.
Eu fiquei sabendo sobre essas novas funções quando vi um tweet da lenda Itzik Ben-Gan sobre isso:
Eu até achei que fosse alguma pegadinha ou brincadeira, fui testar num SQL Server 2019 CU8 (mais recente até o momento) e, como já esperava, apareceu uma mensagem de erro informando que essa função não existe:
Mas quando fui testar no Azure SQL Database, que sempre possui a versão mais atual possível do SQL Server, essa função estava lá:
Então vou demonstrar rapidamente, algumas formas de utilizar essas duas funções no SQL Server.
Se você está utilizando uma versão do SQL Server que não possui suporte às funções GREATEST e LEAST, você consegue ter o mesmo comportamento usando algumas técnicas que eu expliquei no artigo Como recuperar o maior valor entre múltiplas colunas em uma tabela do SQL Server.
Exemplo:
1 2 3 4 5 |
SELECT MAX(Valores.Valor) AS [GREATEST], MIN(Valores.Valor) AS [LEAST] FROM (VALUES (4), (85), (120), (154), (52), (87), (999), (15), (12)) AS Valores(Valor) |
E isso também pode ser aplicado à múltiplas colunas de uma tabela:
1 2 3 4 5 6 7 8 9 |
SELECT ID, Data1, Data2, Data3, ( SELECT MAX(UltimoAcesso) FROM (VALUES (Data1),(Data2),(Data3)) AS UltimoAcesso(UltimoAcesso) ) AS MaiorData FROM ##Teste |
Já utilizando as novas funções, o comportamento é bem simples:
1 2 3 4 5 6 7 |
SELECT ID, Data1, Data2, Data3, GREATEST(Data1, Data2, Data3) AS MaiorData, LEAST(Data1, Data2, Data3) AS MenorData FROM ##Teste |
Lembrando que essa função funciona com datas, números e até mesmo, strings
Exemplo com números:
1 2 3 4 5 6 |
SELECT *, GREATEST(Valor1, Valor2, Valor3, Valor4, Valor5, Valor6) AS GREATEST, LEAST(Valor1, Valor2, Valor3, Valor4, Valor5, Valor6) AS LEAST FROM ##Teste |
Exemplo com palavras:
1 2 3 4 5 6 |
SELECT *, GREATEST(Nome1, Nome2, Nome3, Nome4) AS GREATEST, LEAST(Nome1, Nome2, Nome3, Nome4) AS LEAST FROM #Teste |
- Se o tipo de dado dos valores ou colunas diferir, todas as expressões serão convertidas para o tipo da primeira expressão ou coluna para fazer a comparação.
- Na comparação de strings e textos, a comparação será feita utilizando o código ASCII, ou seja, o algoritmo vai comparar o primeiro caractere de cada expressão e identificar qual tem o maior código ASCII… Em caso de empate, o segundo caractere será avaliado e assim sucessivamente até que todas as expressões já tenham sido avaliadas para decidir o maior ou o menor.
Bom, é isso aí pessoal!
Espero que tenham gostado do artigo e até mais!
Faz falta.
Quando comecei a programar em SQL, habituado que estava com linguagens de programação de uso geral, pensei que max() e min() analisassem um conjunto de valores lineares e então retornassem o maior e o menor valor. Algo assim:
max (8, 3, 5) = 8
Espero que GREATEST e LEAST se tornem disponíveis também no SQL Server.