2009-06-12 4 views
9

Eventuali duplicati:
Is there a Max function in SQL Server that takes two values like Math.Max in .NET?T-SQL equivalente di Excel "MAX" per restituire maggiore di due numeri

In Excel, c'è una funzione chiamata "MAX" che accetta i numeri e restituisce il più grande nel set. Esiste una funzione in T-SQL che duplica questa funzionalità? Non sono stato in grado di trovarne uno, e ho scritto un UDF che lo fa per me, ma ho pensato che valesse la pena di chiedermelo.

Qui è la funzione che ho usato:

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 

non mi aspetto alcuna fortuna, ma invece di spostare la mia funzione di tutta una serie di nuovi server, ho pensato di almeno Chiedere. Grazie!

+0

si vuole realmente un TSQL equivalente della funzione MySQL/Oracle GRANDE. Non so altro che stored procedure :( –

+0

Questo è, infatti, esattamente quello che voglio.Ricerca utilizzando quel nome di funzione solo riaffermare che sono sfortunato.Grazie! – SqlRyan

risposta

10

Non so se la funzione è necessario esiste, ma per una soluzione, mi piace questo uno migliore

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

All'inizio stavo facendo questo, ma poi mi sono stancato di dattilografarlo (visto che dovevo usarlo costantemente) e ho deciso di inserirlo essenzialmente in una UDF, che è il codice che ho dato sopra. Grazie per il suggerimento, però! – SqlRyan

+0

Farà un più piccolo UDF comunque :-) – tekBlues

+2

Attenzione per l'uso di una UDF. A volte il semplice codice di incapsulamento in una UDF causerà problemi di prestazioni perché SQL Server deve agire sul set di risultati riga per riga, mentre le funzioni incorporate di solito possono essere utilizzate su base set-based. –

4

si potrebbe usare:

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

In due diverse pagine di domande su questo ho controllato, la soluzione sembra essere la più corta, la più logica e la più semplice da implementare.Non posso commentare le prestazioni su centinaia di gigabyte di dati, ma è sicuramente il trucco in cui ne avevo bisogno. Le persone che si lamentano che questo approccio è troppo prolisso devono abbracciare l'aspetto "strutturato" di SQL; p –

1

Purtroppo no.

Una parola di avvertimento, per un utilizzo estremamente intensivo, ho trovato che funzioni scalari (anche quelle che potrebbero essere facilmente inline con una CASE, come la tua) davvero non buone prestazioni in SQL Server 2005, quindi se hai a che fare con milioni di chiamate, mettilo in linea (a volte puoi falsificare un TVF in linea).

Eventualmente, SQL Server avrà eventualmente un SVF in linea o una funzione equivalente a GREATEST!

4

dichiaro @first int, int @second

select @ prima = 45, @ secondo = 123

select max (a) da (selezionare @first un UNION ALL select @second) x

-OR

select max (a) da (valori (@first), (@ secondo)) x (a)

+1

Mi piace questo modo di farlo con UNION perché se hai bisogno del massimo o del minimo di un calcolo complicato e di una costante, hai solo scrivere il calcolo una volta. Rende molto più pulito il codice. – John