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 greatest
y 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 least
y greatest
funcionalidad.
- PostgreSQL
GREATEST
/LEAST
- MySQL
GREATEST
/LEAST
- MariaDB
GREATEST
LEAST
- DB2
GREATEST
LEAST
- Oráculo
GREATEST
LEAST
¿Desenrolla las condiciones en las CASE
declaraciones 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
/GREATEST
funciones: 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
VALUES
cláusula yCROSS APPLY
las dos columnas con alias como una sola columna, luego obtener elMIN
yMAX
de cada uno.Hay otras formas de escribirlo, por ejemplo, usando
UNION ALL
Sin 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:
least
que 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 end
funcionaría).En general, puede ser mejor escribir la
case
declaración a mano si el rendimiento es importante. Incluso he recurrido a generarcase
declaraciones 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 WHEN
pero 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 unaCASE
expresión? Mi punto es que, dado que te metiste en problemas con las pruebas de rendimiento, debes probar todos los métodos / respuestas sugeridos.