2009-09-21 13 views
43

तो ओरेकल पहले NULLS है, जो मैं अवरोही क्रम में मेरे कॉलम मूल्य के बाद शीर्ष पर हल कर शून्य मान के लिए उपयोग कर सकते हैं:एसक्यूएल सर्वर ओरेकल के नलल्स के बराबर पहले?

ORDER BY date_sent NULLS FIRST 

क्या एसक्यूएल सर्वर में तुलनीय है? ये विकल्प हैं, मानते हैं कि दिनांक मान शून्य हैं या अतीत में:

ORDER BY ISNULL(date_sent, GETDATE()) DESC 
ORDER BY (CASE WHEN t.setinactive IS NULL THEN 1 ELSE 2 END), t.setinactive DESC 
ORDER BY -CAST(date_sent as int) ASC 

कोई अन्य?

+2

http://stackoverflow.com/questions/821798/order-by-date-showing-nulls-first-then-most-recent-dates –

उत्तर

59

आप कुछ चाल कर सकते हैं:

ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] 
+2

इस चाल के साथ आप अपनी इच्छित ऑर्डरिंग प्राप्त कर सकते हैं। आप कई भाषाओं में पाए जाने वाले अधिक सामान्य आईसीओम्पियर इंटरफ़ेस की भी नकल कर सकते हैं। – usr

1

आप इसे मेरे ज्ञान में नियंत्रित नहीं कर सकते हैं। और ऐसा लगता है कि आपके पास ISNULL के साथ सही दृष्टिकोण है।

तारों के साथ, मैंने उसी उद्देश्य के लिए ISNULL(field, '') का उपयोग किया है।

+0

संभावित संभावित डुप्लिकेट जीएमस्ट्रोस ने कहा है ... – Kev

+1

केवी: यह सब हाथ की समस्या की प्रकृति पर निर्भर करता है। सवाल यह नहीं था कि "क्या यह सभी मामलों में उपयोग करने के लिए आदेश द्वारा आदेश है?" और इसलिए जी मास्ट्रोस बिंदु अच्छी तरह से प्रसिद्ध है लेकिन सवाल के महत्वपूर्ण रास्ते पर सख्ती से नहीं है। रेक्सम नल सॉर्टिंग को नियंत्रित करने का एक और वैश्विक तरीका ढूंढ रहा है। –

5

प्रकरण का प्रयोग करें/जब बयान, उदाहरण के लिए:

ORDER BY (case WHEN ColINT IS NULL THEN {maxIntValue} ELSE ColINT END) DESC 

ORDER BY (case WHEN ColVChar IS NULL THEN {maxVCharValue} ELSE ColVChar END) DESC 

ORDER BY (case WHEN ColDateT IS NULL THEN {maxDateTValue} ELSE ColDateT END) DESC 

... और इतने पर।

या इससे भी बेहतर, क्योंकि आपको परवाह नहीं है कि आपका कॉलम प्रकार और अधिकतम मूल्य क्या है।

ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC 
4

आप दिनांकों अब की तुलना में अधिक के साथ अब की तुलना में कम तिथियों के साथ अपने तालिका में पंक्तियों, और अन्य पंक्तियों है, तो अपने NULLS के बीच में प्रकट होता सूचि। इसके बजाए, आपको शायद उस मान का उपयोग करना चाहिए जो आपकी सूची के मध्य में कभी भी क्रमबद्ध नहीं होगा। IsNull (Date_Sent, '17,530,101') की वर्णन द्वारा

आदेश

नोट: यह तिथि वास्तव में 1 जनवरी 1753.

+0

IsNull द्वारा आदेश (Date_Sent, '17530101') desc यह सुनिश्चित करेगा कि मेरे कॉलम एक शून्य दिनांक_सेंट मान के साथ नीचे दिखाई दें, शीर्ष पर नहीं। आप सही हैं, लेकिन मैं date_sent value =) –

+0

सेट करने के लिए भविष्य में यात्रा नहीं करता हूं, लेकिन सिद्धांत अभी भी है। आपको उस मान का उपयोग करना चाहिए जो आपके डेटा में स्वाभाविक रूप से नहीं होगा। पूर्व: IsNull द्वारा आदेश (Date_Sent, '99990101') desc –

+0

पूरी तरह से एक सेंटीनेल मूल्य के उपयोग पर सहमत हैं। –

3
ORDER BY 
    COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000') 
,OTHER_FIELDS 
+0

काम नहीं करता है - नल पहले हैं, लेकिन बाकी दिनांक_सेंट कॉलम डीईएससी क्रम में क्रमबद्ध नहीं हैं। –

3

यह एक वैकल्पिक तरीका है जब आप को समायोजित करने के लिए कैसे nulls दिखाई चाहते है क्रम क्रम में। कॉलम को नकारात्मक करें और अपने सॉर्ट ऑर्डर को उलट दें। दुर्भाग्यवश आपको CAST डेटटाइम कॉलम की आवश्यकता होगी।

ORDER BY -CAST(date_sent as int) ASC 
+0

पुष्टि की गई: नल शीर्ष पर हैं, और गैर-शून्य मान डीईएससी आदेश में हैं। –

4

एक साधारण उदाहरण:

SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3 
FROM TableName 
ORDER BY ValueIsNull DESC, Value1 
11

त्वरित जवाब यह है: आवश्यक मामलों में nulls के आदेश को बदलने के लिए सबसे अच्छा समाधान को स्वीकार कर लिया है।

  • DESC + NULLS सबसे पहले:

    ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] DESC

  • एएससी + NULLS पिछले:

    ORDER BY (CASE WHEN [Order] IS NULL THEN 1 ELSE 0 END), [Order] ASC लेकिन आप केवल यह, या आवश्यक मामलों में उसकी किसी विविधता का उपयोग करना

  • एएससी + न्यूलस पहला: यह डिफ़ॉल्ट रूप से ठीक काम करता है

  • DESC + पिछले NULLS: यह डिफ़ॉल्ट रूप से ठीक काम करता है

देखते क्यों करते हैं:

आप ORDER BY Clause (Transact-SQL) MSDN docs चेक करें, और ASC | DESC के लिए नीचे स्क्रॉल, तो आप इस पढ़ सकते हैं:

एएससी | डीईएससी

निर्दिष्ट करता है कि निर्दिष्ट कॉलम में मान आरोही या अवरोही क्रम में क्रमबद्ध किए जाने चाहिए। एएससी निम्नतम मूल्य से उच्चतम मूल्य तक है। डीईएससी उच्चतम मूल्य से निम्नतम मूल्य तक है। एएससी डिफ़ॉल्ट क्रम क्रम है। शून्य मानों को सबसे कम संभव मान माना जाता है।

तो डिफ़ॉल्ट रूप से यदि आप ASC ऑर्डर निर्दिष्ट करते हैं, तो यह NULLS FIRST जैसा काम करता है। और, यदि आप DESC निर्दिष्ट करते हैं, तो यह NULLS LAST जैसा काम करता है।

तो तुम केवल DESC क्रम में NULLS FIRST व्यवहार बदल करने की जरूरत है, और ASC क्रम में NULLS LAST के लिए।

आईएमएचओ, आवश्यक मामलों में नल के आदेश को बदलने के लिए सबसे अच्छा समाधान स्वीकार्य है, लेकिन मैंने इसे अपने उत्तर की शुरुआत में विभिन्न मामलों में अनुकूलित किया है।

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