2009-06-12 15 views
9
का बड़ा लौटने के लिए

संभव डुप्लिकेट:
Is there a Max function in SQL Server that takes two values like Math.Max in .NET?T-SQL बराबर दो नंबर

एक्सेल में, वहाँ एक समारोह "मैक्स" कहा जाता है कि संख्या को स्वीकार करता है और सेट में सबसे बड़ा रिटर्न देता है। क्या टी-एसक्यूएल में कोई फ़ंक्शन है जो इस कार्यक्षमता को डुप्लिकेट करता है? मैं एक खोजने में सक्षम नहीं हूं, और मैंने एक यूडीएफ लिखा है जो मेरे लिए करता है, लेकिन मैंने सोचा कि यह पूछने लायक था।

यहाँ समारोह मैं प्रयोग कर रहे है:

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 

मैं किसी भी भाग्य की उम्मीद नहीं है, लेकिन नए सर्वर की एक पूरी गुच्छा के लिए अपने समारोह हिलाने की बजाय, मैंने सोचा कि मैं कम से कम था पूछना। धन्यवाद!

+0

आप वास्तव में MySQL/Oracle समारोह महानतम में से एक TSQL बराबर करना चाहते हैं। संग्रहीत प्रक्रिया के अलावा किसी अन्य को नहीं जानते :( –

+0

यह वास्तव में, वही है जो मैं चाहता हूं। उस फ़ंक्शन नाम का उपयोग करके खोज केवल पुनः पुष्टि करता है कि मैं भाग्य से बाहर हूं। धन्यवाद! – SqlRyan

उत्तर

10

समारोह आप की जरूरत मौजूद है अगर मैं नहीं जानता, लेकिन एक वैकल्पिक हल के लिए, मुझे पसंद है यह एक बेहतर

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

पहले मैं यह कर रहा था, लेकिन तो मैं इसे टाइप करने से थक गया (क्योंकि मुझे इसे लगातार उपयोग करना पड़ा) और अनिवार्य रूप से इसे यूडीएफ में लपेटने का फैसला किया, जो मैंने ऊपर दिया है। सुझाव के लिए धन्यवाद, हालांकि! – SqlRyan

+0

यह एक छोटा कर देगा यूडीएफ वैसे भी :-) – tekBlues

+2

इसके लिए यूडीएफ का उपयोग करने से सावधान रहें। कभी-कभी यूडीएफ में कोड को समाहित करने से प्रदर्शन समस्याएं उत्पन्न हो जाती हैं क्योंकि SQL सर्वर को परिणाम-पंक्ति पर पंक्ति-दर-पंक्ति आधार पर कार्य करना होता है, जबकि अंतर्निहित फ़ंक्शंस आमतौर पर सेट-आधारित आधार पर उपयोग किए जा सकते हैं। –

4

आप इस्तेमाल कर सकते हैं:

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

इस पर दो अलग-अलग प्रश्न पृष्ठों में मैंने जांच की है, आपका समाधान सबसे छोटा, सबसे तार्किक और कार्यान्वित करने के लिए सबसे आसान लगता है।मैं सैकड़ों-गीगाबाइट्स-डेटा पर प्रदर्शन पर टिप्पणी नहीं कर सकता, लेकिन यह निश्चित रूप से वह चाल है जहां मुझे इसकी आवश्यकता थी। जो लोग शिकायत करते हैं कि इस दृष्टिकोण को एसक्यूएल के 'संरचित' पहलू को गले लगाने की भी आवश्यकता है; पी –

1

दुर्भाग्य से नहीं।

चेतावनी का एक शब्द है, अत्यंत गहन उपयोग के लिए, मैंने पाया कि अदिश कार्य (यहां तक ​​कि उन जो आसानी से एक CASE साथ inlined किया जा सकता है, आपके जैसे) वास्तव में अच्छी तरह से SQL सर्वर 2005 पर, प्रदर्शन नहीं करते, इसलिए यदि आप लाखों कॉल से निपट रहे हैं, इसे इनलाइन डालें (कभी-कभी आप नकली इनलाइन टीवीएफ) कर सकते हैं।

उम्मीद है, एसक्यूएल सर्वर अंत में एक इनलाइन SVF है या GREATEST करने के लिए एक समारोह बराबर होगा!

4

घोषित @first पूर्णांक, @second पूर्णांक

चयन @ पहली = 45, @ दूसरा = 123

चयन अधिकतम (क) (एक संघ @first चुनें सभी को चुनें @second) से x

--या

चयन अधिकतम (क) से (मूल्यों (@first), (@ सेकंड)) x (क)

+1

मुझे यूनियन के साथ ऐसा करने का तरीका पसंद है क्योंकि यदि आपको जटिल गणना और निरंतर अधिकतम या न्यूनतम की आवश्यकता है, तो आपके पास केवल एक बार गणना लिखने के लिए। बहुत क्लीनर कोड के लिए बनाता है। – John

संबंधित मुद्दे