2009-08-20 11 views
6

Cómo implementar el escalar MAX en el servidor Sql (como Math.Max). (En esencia Quiero implementar algo como Max (expresión, 0), para que los valores negativos reemplazados por 0.)Scalar Max en el servidor Sql

que he visto en otras soluciones hilos con

  • crear una función escalar (cómo es que con el rendimiento?) caso
  • cuando la expresión> 0 THEN expresión en caso contrario 0) (a continuación, 'expresión' se evalúa dos veces?)
  • usos complicados de Max (agregado).

¿Cuál es el mejor? ¿Por qué el servidor Sql no tiene algo como esto integrado? ¿Alguna complicación que no veo?

+0

http://stackoverflow.com/questions/989415/t-sql-equivalent-of-excel-max-function-to-return-larger-of-two-numbers –

+0

http://stackoverflow.com/questions/124417/is-there-a-max-function-in-sql-server-that-takes-two-values-like-math-max-in-net – JoeCool

+0

Para obtener esta característica en el producto, vote en el Elemento de Microsoft Connect: http://connect.microsoft.com/SQLServer/feedback/details/767183/t-sql-provide-scalar-min-and-scalar-max – usr

Respuesta

1

desea crear una función escalar definida por el usuario llamada MAX en el servidor sql para tomar dos parámetros como entrada, una expresión y un valor mínimo, y devolver la expresión si excede el valor mínimo; de lo contrario, devuelva el valor mínimo?

No me preocuparía el rendimiento de las funciones escalares, deje que el servidor lo haga. También usaría IF en vez de CASE para probar el valor> mínimo.

SQL Server no tiene una función incorporada para usted porque no pensaron que se usaría lo suficiente, supongo.

+0

sobre el rendimiento de las funciones escalares: pueden ser realmente dolorosas , pero creo que es seguro suponer que mientras no exista una lógica de tabla/vista involucrada, deberían ser bastante rápidas (como funciones integradas del sistema) - Rein 0 segundos atrás – Rein

5

En todos los demás sistemas principales, esta función se llama GREATEST.

SQL ServerEn serio locks it.

Usted puede hacer un montón de declaraciones de casos, o usar algo como esto:

SELECT (
     SELECT MAX(expression) 
     FROM (
       SELECT expression 
       UNION ALL 
       SELECT 0 
       ) q 
     ) AS greatest 
FROM table_that_has_a_field_named_expression 

El último es un poco menos eficiente que CASE declaraciones.

+0

Esto es genial porque si la primera expresión es un cálculo complicado y lo está comparando con una constante, usted ¡Tengo que escribir el complicado cálculo una vez! – John

+1

Para obtener esta característica en el producto, vote el artículo de Microsoft Connect: http://connect.microsoft.com/SQLServer/feedback/details/767183/t-sql-provide-scalar-min-and-scalar- max – usr

+0

¡Votado!¡Esto definitivamente sería una adición útil! – eidylon

0

El optimizador de consultas debe evitar que la expresión se calcule varias veces.

Para la legibilidad/mantenibilidad, considere usar un CTE para calcular la expresión antes de la instrucción CASE.

Cuestiones relacionadas