SQL सर्वर आदेश दिनांक और अशक्त द्वारा अंतिम


82

मैं आज तक आदेश देने की कोशिश कर रहा हूं। मैं चाहता हूं कि सबसे हाल की तारीखें पहले आएं। यह काफी आसान है, लेकिन ऐसे कई रिकॉर्ड हैं जो अशक्त हैं और वे किसी भी रिकॉर्ड से पहले आते हैं जिनकी तारीख है।

मैंने बिना किसी सफलता के कुछ चीजें आजमाई हैं:

ORDER BY ISNULL(Next_Contact_Date, 0)

ORDER BY ISNULL(Next_Contact_Date, 999999999)

ORDER BY coalesce(Next_Contact_Date, 99/99/9999)

मैं आज तक कैसे ऑर्डर कर सकता हूं और नल अंतिम में आ गए हैं? डेटा प्रकार है smalldatetime


क्या सॉर्ट ऑर्डर को आरोही होने की आवश्यकता है, लेकिन अंत में नल के साथ? और क्या आपके टेबल में भविष्य की तारीखें होंगी?
एलनजी

@ एलेन जी, हाँ, अतीत से भविष्य तक अतीत के साथ और इतने पर। तो हाँ, आरोही। हां, भविष्य की तिथियां उनमें से अधिकांश हैं।
अपहेलिक्स

जवाबों:


112

smalldatetime 6 जून, 2079 तक है, इसलिए आप इसका उपयोग कर सकते हैं

ORDER BY ISNULL(Next_Contact_Date, '2079-06-05T23:59:00')

यदि कोई वैध रिकॉर्ड नहीं है तो वह तारीख होगी।

यदि यह एक धारणा नहीं है, तो आप एक अधिक मजबूत विकल्प पर भरोसा करते हैं जो दो स्तंभों पर छंटनी कर रहे हैं।

ORDER BY CASE WHEN Next_Contact_Date IS NULL THEN 1 ELSE 0 END, Next_Contact_Date

उपरोक्त दोनों सुझाव हालांकि एक तरह से बचने और समान दिखने वाली योजनाओं को देने के लिए एक सूचकांक का उपयोग करने में सक्षम नहीं हैं।

यहाँ छवि विवरण दर्ज करें

एक अन्य संभावना अगर ऐसा सूचकांक मौजूद है

SELECT 1 AS Grp, Next_Contact_Date 
FROM T 
WHERE Next_Contact_Date IS NOT NULL
UNION ALL
SELECT 2 AS Grp, Next_Contact_Date 
FROM T 
WHERE Next_Contact_Date IS NULL
ORDER BY Grp, Next_Contact_Date

योजना


इस ट्रिक को VARCHARफ़ील्ड्स पर भी लागू किया जा सकता है (उदाहरण के लिए ORDER BY ISNULL(my_varchar, 'ZZZZZZ')) और बेहद उपयोगी है, खासकर ऑर्डर करते समय एक निश्चित तरीके से उपयोग करने के लिए GROUP BY . . . GROUPING SETS। इसे पोस्ट करने के लिए धन्यवाद।
स्पार्क_स्प्रेड

नीचे से नल लगाने के लिए हम desc द्वारा ऑर्डर का उपयोग क्यों नहीं कर सकते? भी, हम 1 से अशक्त क्यों हैं?
20

35

एमएस एसक्यूएल सर्वर 2012 के लिए टी-एसक्यूएल फंडामेंटल्स के लेखक इत्ज़िक बेन-गण के अनुसार , "डिफ़ॉल्ट रूप से, एसक्यूएल सर्वर गैर-पूर्ण मूल्यों से पहले NULL अंकों को छाँटता है। अंतिम क्रमबद्ध करने के लिए NULL अंक प्राप्त करने के लिए , आप एक CASE अभिव्यक्ति का उपयोग कर सकते हैं। 1 जब " Next_Contact_Date कॉलम NULL है ," और 0 जब यह NULL नहीं है । नॉन- NULL मार्क्स को एक्सप्रेशन से 0 वापस मिलता है; इसलिए, वे NULL मार्क्स से पहले सॉर्ट करते हैं (जो 1 मिलता है)। इस CASE एक्सप्रेशन को पहले के रूप में प्रयोग किया जाता है। सॉर्ट कॉलम। " Next_Contact_Dateस्तंभ "दूसरी तरह स्तंभ के रूप में निर्दिष्ट किया जाना चाहिए। इस तरह, गैर शून्य आपस में तरह सही ढंग से अंक।" यहाँ MS SQL Server 2012 (और SQL Server 2014) के लिए आपके उदाहरण के लिए समाधान क्वेरी है:

ORDER BY 
   CASE 
        WHEN Next_Contact_Date IS NULL THEN 1
        ELSE 0
   END, Next_Contact_Date;

IIF सिंटैक्स का उपयोग कर समतुल्य कोड:

ORDER BY 
   IIF(Next_Contact_Date IS NULL, 1, 0),
   Next_Contact_Date;

इसके अलावा, उत्तर में जोड़ने के लिए, यदि आप IIF के 1 और 0 को स्विच करते हैं, तो नल शीर्ष पर जाएंगे। यह भी काम करता है अगर आप टेबल के शीर्ष पर एक एकल टुपल्स चाहते हैं।
फ्रेंको पेटीग्रोसो

3

यदि आपका SQL समर्थन नहीं करता है NULLS FIRSTया NULLS LAST, ऐसा करने का सबसे सरल तरीका value IS NULLअभिव्यक्ति का उपयोग करना है:

ORDER BY Next_Contact_Date IS NULL, Next_Contact_Date

नलियों को अंत में लगाने के लिए ( NULLS LAST) या

ORDER BY Next_Contact_Date IS NOT NULL, Next_Contact_Date

नल को सामने रखना है। इसके लिए कॉलम के प्रकार को जानने की आवश्यकता नहीं है और CASEअभिव्यक्ति की तुलना में पढ़ना आसान है ।

संपादित करें: काश, जबकि यह PostgreSQL और MySQL जैसे अन्य SQL कार्यान्वयन में काम करता है, यह MS SQL सर्वर में काम नहीं करता है। मेरे पास परीक्षण करने के लिए SQL सर्वर नहीं था और Microsoft के प्रलेखन और अन्य SQL कार्यान्वयन के साथ परीक्षण पर निर्भर था। Microsoft के अनुसार, value IS NULL एक ऐसी अभिव्यक्ति है जो किसी अन्य अभिव्यक्ति की तरह ही प्रयोग करने योग्य होनी चाहिए। और ORDER BY अभिव्यक्ति लेने वाले किसी भी अन्य कथन की तरह ही अभिव्यक्ति लेना माना जाता है । लेकिन यह वास्तव में काम नहीं करता है।

SQL सर्वर के लिए सबसे अच्छा समाधान इसलिए CASEअभिव्यक्ति प्रतीत होता है ।


7
यह मान्य SQL Server वाक्यविन्यास नहीं है
मार्टिन स्मिथ

3
उसके लिए माफ़ करना। यह Microsoft दस्तावेज़ों के अनुसार मान्य होना चाहिए और अन्य SQL में काम करता है, लेकिन MS वास्तव में इसकी अनुमति नहीं देता है।
Vroo

समझदार प्रदर्शन यह भयानक लगता है कि आपके 2 कर रहे हैं मानदंड
ColacX

आपके द्वारा लिंक किए गए Microsoft दस्तावेज़ में, मैंने पढ़ा है कि मान NULL एक अभिव्यक्ति नहीं है , बल्कि एक विधेय है । यह वैसा नहीं है।
बर्टूपीजी

1
Microsoft के अनुसार, एक विधेय एक अभिव्यक्ति है। यह शाब्दिक रूप से docs.microsoft.com/en-us/sql/t-sql/queries/predicates
Vroo

3
order by -cast([Next_Contact_Date] as bigint) desc

एक त्रुटि है अगर Next_Contact_Dateअशक्त हैExplicit conversion from data type date to bigint is not allowed.
Nerdroid

2

थोड़ा देर से, लेकिन शायद किसी को यह उपयोगी लगता है।

मेरे लिए, तालिका स्कैन के कारण ISNULL प्रश्न से बाहर था। UNION ALL को मुझे एक जटिल प्रश्न दोहराने की आवश्यकता होगी, और मेरे द्वारा केवल TOP X का चयन करने के कारण यह बहुत कुशल नहीं होगा।

यदि आप टेबल डिज़ाइन को बदलने में सक्षम हैं, तो आप कर सकते हैं:

  1. केवल छँटाई के लिए एक और फ़ील्ड जोड़ें, जैसे कि Next_Contact_Date_Sort।

  2. एक ट्रिगर बनाएं जो उस क्षेत्र को एक बड़े (या छोटे) मान से भरता है, जो आपके लिए आवश्यक है:

    CREATE TRIGGER FILL_SORTABLE_DATE ON YOUR_TABLE AFTER INSERT,UPDATE AS 
    BEGIN
        SET NOCOUNT ON;
        IF (update(Next_Contact_Date)) BEGIN
        UPDATE YOUR_TABLE SET Next_Contact_Date_Sort=IIF(YOUR_TABLE.Next_Contact_Date IS NULL, 99/99/9999, YOUR_TABLE.Next_Contact_Date_Sort) FROM inserted i WHERE YOUR_TABLE.key1=i.key1 AND YOUR_TABLE.key2=i.key2
        END
    END
    

2

यदि आवश्यक हो तो डेस का उपयोग करें और -1 से गुणा करें। अशक्त अंतिम क्रम में आरोही int के आदेश के लिए उदाहरण:

select * 
from
(select null v union all select 1 v union all select 2 v) t
order by -t.v desc

लगता है कि यह दिनांक की तरह चर के लिए काम नहीं करेगा ..
शार्लोट देंग

1

मुझे पता है कि यह पुराना है लेकिन यह मेरे लिए काम कर रहा है

Order by Isnull(Date,'12/31/9999')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.