Al revisar esta pregunta , parece que es mucho trabajo que no debería ser necesario. Están tratando de extender un rango con una fecha. En otras bases de datos, simplemente usaría greatesty least...
least(extendDate,min), greatest(extendDate,max)Sin embargo, cuando trato de usar estos, me sale
'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.Eso cubriría la extensión en cualquier dirección.
A los fines de la pregunta, aún tendría que hacer un reemplazo de rango exclusivo.
Me pregunto cómo los usuarios de SQL Server implementan patrones de consulta para imitar leasty greatestfuncionalidad.
- PostgreSQL GREATEST/LEAST
- MySQL GREATEST/LEAST
- MariaDB GREATESTLEAST
- DB2 GREATESTLEAST
- Oráculo GREATESTLEAST
¿Desenrolla las condiciones en las CASEdeclaraciones o hay una extensión, un complemento de terceros o una licencia de Microsoft que habilite esta funcionalidad?
                    
                        sql-server
                                t-sql
                                feature-comparison
                                
                    
                    
                        Evan Carroll
fuente
                
                fuente

LEAST/GREATESTfunciones: casi todos los competidores RDBMS tienen al menos equivalentes. La única excepción que pude encontrar es Sybase, pero también ha sido descontinuada durante muchos años en este momento.Respuestas:
Un método común es usar la
VALUEScláusula yCROSS APPLYlas dos columnas con alias como una sola columna, luego obtener elMINyMAXde cada uno.Hay otras formas de escribirlo, por ejemplo, usando
UNION ALLSin embargo, los planes de consulta resultantes parecen ser los mismos.
fuente
También puede poner los valores en línea en una subconsulta. Me gusta esto:
fuente
Este sería un buen comienzo -
fuente
MENOS equivalente:
MAYOR equivalente:
fuente
least(5,6,7,8,9)?Creo funciones definidas por el usuario, p. Ej.
Aunque puede funcionar en casos simples, hay varios problemas con este enfoque, sin embargo:
leastque hace el operador en Oracle y MySQL, pero difiere de Postgres. Pero esta armadura contra nulo lo hace más detallado (si sabe que no serán nulos, una llanuracase when @a <= @b then @a else @b endfuncionaría).En general, puede ser mejor escribir la
casedeclaración a mano si el rendimiento es importante. Incluso he recurrido a generarcasedeclaraciones anidadas en el lado del cliente cuando hay varios valores para comparar.fuente
Tenía la intención de agregar comentarios a la respuesta @ ed-avis, pero no pude hacerlo, debido a la falta de reputación, por lo que publico esto como una extensión de su respuesta.
Eliminé la desventaja de "Molesto, tienes que hacer funciones separadas para cada tipo de datos". Usando SQL_VARIANT .
Aquí está mi implementación:
También esta función maneja NULL s como la versión postgresql.
Esta función podría agregarse a la base de datos por conveniencia, pero es 10 veces más lenta que el uso integrado
IIF. Mis pruebas muestran que dicha función con tipo exacto ( fecha y hora ) funciona igual que la versión sql_variant .PD : ejecuto algunas pruebas en un conjunto de datos de valores de 350k, y parece que el rendimiento es el mismo, sql_variant es un poco más rápido, pero creo que es solo inquietud.
Pero de cualquier manera, la versión IIF es 10 veces más rápida
No he probado en línea,
CASE WHENpero básicamente para t-sql IIF es lo mismo que mayúsculas y minúsculas , y si el optimizador lo convierte en expresión de mayúsculas y minúsculas.CONCLUSIÓN: Es más rápido usar IIF si el rendimiento es importante, pero para la creación de prototipos, o si se necesita más claridad de código, y no hay grandes cálculos involucrados, siempre que se pueda utilizar la función.
fuente
iif(a<b, a, b)es 10 veces más rápido que cualquier función definida por el usuario.IIF(), es más rápida que usar unaCASEexpresión? Mi punto es que, dado que te metiste en problemas con las pruebas de rendimiento, debes probar todos los métodos / respuestas sugeridos.