2009-06-12 7 views
9

Duplicar posibles:
Is there a Max function in SQL Server that takes two values like Math.Max in .NET?T-SQL equivalente de Excel "MAX" para devolver mayor de dos números

En Excel, hay una función llamada "MAX" que acepta números y devuelve el más grande en el conjunto. ¿Hay alguna función en T-SQL que duplique esta funcionalidad? No he podido encontrar uno, y he escrito un FDU que lo hace por mí, pero pensé que valía la pena preguntarlo.

Aquí es la función que he estado usando:

CREATE FUNCTION dbo.LargerOf 
(
    -- Add the parameters for the function here 
    @First FLOAT, 
    @Second FLOAT 
) 
RETURNS FLOAT 
AS 
BEGIN 

    DECLARE @Result FLOAT 

    IF @First > @Second 
     SET @result = @First 
    ELSE 
     SET @Result = @Second 

    RETURN @Result 

END 
GO 

No espero un poco de suerte, pero en vez de mover mi función a un montón de nuevos servidores, pensé que había al menos pedir. ¡Gracias!

+0

que realmente desea un tsql equivalente a la función de MySQL/Oracle MAYOR. No sé otro que el procedimiento almacenado :( –

+0

Eso es, de hecho, exactamente lo que quiero. Buscar usando el nombre de esa función solo reafirma que no he tenido suerte. ¡Gracias! – SqlRyan

Respuesta

10

No sé si la función que necesita existe, pero para una solución, me gusta esta mejor

set @max = case when @first > @second then @first else @second end 
+0

Al principio estaba haciendo esto, pero luego me cansé de tipearlo (ya que tenía que usarlo constantemente) y decidí envolverlo en un UDF, que es el código que he dado más arriba. ¡Gracias por la sugerencia, sin embargo! – SqlRyan

+0

Hará un pequeño UDF de todos modos :-) – tekBlues

+2

Tenga cuidado al usar un UDF para esto. A veces, el simple hecho de encapsular el código en una UDF causará problemas de rendimiento porque SQL Server tiene que actuar en el conjunto de resultados fila por fila, mientras que las funciones incorporadas generalmente se pueden usar en base a conjuntos. –

4

que puede usar:

CASE 
    WHEN @First >= @Second THEN @FIRST 
    ELSE @Second 
END 
+0

A través de dos páginas de preguntas diferentes sobre esto, he comprobado que su solución parece ser la más corta, la más lógica y la más fácil de implementar.No puedo comentar sobre el rendimiento en cientos de gigabytes de datos, pero seguro que es el truco donde lo necesitaba. Las personas que se quejan de que este enfoque es demasiado detallado necesitan adoptar el aspecto 'estructurado' de SQL; p –

1

Desafortunadamente no.

Una palabra de advertencia, para el uso muy intensivo, he encontrado que las funciones escalares (incluso aquellas que podrían ser fácilmente entre líneas con un CASE, como la suya realmente) no se desempeñan bien en SQL Server 2005, por lo que si usted está lidiando con millones de llamadas, póngala en línea (a veces puede falsificar una TVF en línea).

Afortunadamente, SQL Server eventualmente tendrá un SVF en línea o una función equivalente a GREATEST!

4

declarar @first int, @second int

seleccione @ primera = 45, @ segundos = 123

select max (a) de (seleccione @first un UNION ALL seleccione @second) x

-OR

select max (a) de (valores (@first), (@ segundo)) x (a)

+1

Me gusta esta forma de hacerlo con UNION porque si necesita el máximo o mínimo de un cálculo complicado y una constante, solo tiene para escribir el cálculo una vez Hace un código mucho más limpio. – John

Cuestiones relacionadas