Revendo esta pergunta , parece que é preciso muito trabalho. Eles estão tentando estender um intervalo com uma data. Em outros bancos de dados, você apenas usaria greatest
e least
..
least(extendDate,min), greatest(extendDate,max)
Quando tento usá-las, recebo
'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.
Isso cobriria a extensão em qualquer direção.
Para os fins da pergunta, você ainda teria que fazer a substituição exclusiva da faixa.
Só estou me perguntando como os usuários do SQL Server implementam padrões de consulta para imitar least
e greatest
funcionalidade.
- PostgreSQL
GREATEST
/LEAST
- MySQL
GREATEST
/LEAST
- MariaDB
GREATEST
LEAST
- DB2
GREATEST
LEAST
- Oráculo
GREATEST
LEAST
Você desenrola as condições em CASE
instruções ou há uma extensão, complemento de terceiros ou licença da Microsoft que habilita essa funcionalidade?
sql-server
t-sql
feature-comparison
Evan Carroll
fonte
fonte
LEAST
/GREATEST
funções - quase todos os concorrentes do RDBMS têm pelo menos equivalentes. A única exceção que pude encontrar é o Sybase, mas que também foi descontinuado por muitos anos.Respostas:
Um método comum é a utilização da
VALUES
cláusula, eCROSS APPLY
as duas colunas com alias como uma única coluna, em seguida obter aMIN
eaMAX
de cada um.Existem outras maneiras de escrevê-lo, por exemplo, usando
UNION ALL
No entanto, os planos de consulta resultantes parecem ser os mesmos.
fonte
Você também pode colocar os valores embutidos em uma subconsulta. Como isso:
fonte
Este seria um bom começo -
fonte
MENOS equivalente:
MAIOR equivalente:
fonte
least(5,6,7,8,9)
?Crio funções definidas pelo usuário, por exemplo
Embora possa funcionar em casos simples, existem vários problemas com essa abordagem:
least
operador faz no Oracle e MySQL, mas difere do Postgres. Mas essa proteção contra o nulo o torna mais detalhado (se você souber que eles não serão nulos, uma planíciecase when @a <= @b then @a else @b end
funcionaria).Em suma, pode ser melhor escrever a
case
declaração à mão, se o desempenho for importante. Eu até recorri à geração decase
instruções aninhadas no lado do cliente quando há vários valores para comparar.fonte
Pretendia adicionar um comentário à resposta @ ed-avis, mas não consegui fazê-lo, devido à falta de reputação, postando isso como extensão à sua resposta.
Eu eliminei a desvantagem de "Irritantemente você precisa criar funções separadas para cada tipo de dados". Usando SQL_VARIANT .
Aqui está a minha implementação:
Além disso, esta função lida com NULL s como a versão do postgresql.
Essa função pode ser adicionada ao DB por conveniência, mas é 10 vezes mais lenta que o uso interno
IIF
. Meus testes mostram que essa função com o tipo exato ( datetime ) executa o mesmo que a versão sql_variant .PS: Eu executo alguns testes no conjunto de dados de valores de 350k e parece que o desempenho é o mesmo, sql_variant é um pouco mais rápido, mas acredito que seja apenas nervosismo.
Mas de qualquer maneira a versão IIF é 10x vezes mais rápida !!!
Eu não testei em linha,
CASE WHEN
mas basicamente o t-sql IIF é o mesmo que o caso , e o iif get é convertido pelo otimizador em expressão de caso.CONCLUSÃO: É mais rápido usar o IIF se o desempenho importa, mas para a criação de protótipos ou se a clareza do código é mais necessária e não há grandes cálculos envolvidos, desde que a função possa ser usada.
fonte
iif(a<b, a, b)
é 10 vezes mais rápido que qualquer função definida pelo usuário.IIF()
- é mais rápida do que usar umaCASE
expressão? O que quero dizer é que, desde que você enfrentou problemas no teste de desempenho, deve testar todos os métodos / respostas sugeridos.