2009-06-12 7 views
9

Mögliche Duplizieren:
Is there a Max function in SQL Server that takes two values like Math.Max in .NET?T-SQL-Äquivalent von Excel "MAX" Funktion zurückzukehren größere von zwei Zahlen

In Excel gibt es eine Funktion "MAX" genannt, die Zahlen akzeptiert und gibt den größten im Satz zurück. Gibt es eine Funktion in T-SQL, die diese Funktionalität dupliziert? Ich konnte keins finden, und ich habe eine UDF geschrieben, die das für mich macht, aber ich dachte, es wäre eine Frage wert.

Hier ist die Funktion, die ich verwendet haben:

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 

erwarte ich kein Glück, sondern meine Funktion auf eine ganze Reihe von neuen Servern zu bewegen, ich dachte, dass ich zumindest würde Fragen. Vielen Dank!

+0

Sie wollen tatsächlich eine Tsql Äquivalent der MySQL/Oracle-Funktion am größten. Ich kenne keine andere als gespeicherte Prozedur :( –

+0

Das ist in der Tat genau das, was ich will. Die Suche mit diesem Funktionsnamen bestätigt nur, dass ich kein Glück habe. Danke! – SqlRyan

Antwort

10

Ich weiß nicht, ob die Funktion, die Sie existiert benötigen, aber für dieses Problem zu umgehen, Ich mag diese eine bessere

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

Zuerst habe ich das gemacht, aber dann wurde ich es leid, es zu tippen (da ich es ständig benutzen musste) und beschloss, es im Wesentlichen in eine UDF zu verpacken, was der Code ist, den ich oben angegeben habe. Danke für den Vorschlag, aber! – SqlRyan

+0

Es wird kleiner UDF sowieso :-) – tekBlues

+2

Sei vorsichtig mit einer UDF dafür. Manchmal führt die einfache Kapselung von Code in einer UDF zu Leistungsproblemen, da SQL Server zeilenweise auf die Ergebnismenge reagieren muss, während integrierte Funktionen in der Regel auf einer Set-basierten Basis verwendet werden können. –

4

Sie verwenden:

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

Auf zwei verschiedenen Frage-Seiten, die ich überprüft habe, scheint Ihre Lösung die kürzeste, logischste und am einfachsten zu implementierende Lösung zu sein.Ich kann die Leistung auf Hunderten von Gigabyte von Daten nicht kommentieren, aber es macht den Trick, wo ich es brauchte. Leute, die beschweren, dass dieser Ansatz zu ausführlich ist, müssen den 'strukturierten' Aspekt von SQL annehmen; p –

1

Leider nicht.

Ein Wort der Warnung, für extrem intensive Nutzung, habe ich, dass skalare Funktionen gefunden (auch solche, die leicht mit einem CASE, wie dem Ihrem inlined werden könnten) wirklich nicht gute Leistung auf SQL Server 2005, so dass, wenn Sie haben es mit Millionen von Anrufen zu tun, stecken Sie es inline (manchmal können Sie einen Inline-TVF fälschen).

Hoffentlich wird SQL Server schließlich eine Inline-SVF haben oder eine Funktion haben, die GREATEST entspricht!

4

declare @first int, int @Second

select @ first = 45, @ Sekunde = 123

select max (a) aus (select @first eine UNION alle auswählen @Second) x

-OR

select max (a) aus (Werte (@first), (@ Sekunde)) x (a)

+1

Ich mag diese Art, es mit UNION zu tun, denn wenn Sie das Maximum oder Minimum einer komplizierten Berechnung und einer Konstante benötigen, haben Sie nur um die Berechnung einmal zu schreiben. Macht viel saubereren Code. – John

Verwandte Themen