एसक्यूएल छांटते समय अशक्त मान कैसे बनाते हैं एसक्यूएल


297

मेरे पास एक डेटाइम फ़ील्ड के साथ एक SQL टेबल है। प्रश्न में क्षेत्र शून्य हो सकता है। मेरे पास एक क्वेरी है और मैं चाहता हूं कि परिणाम डेटाइम फ़ील्ड द्वारा आरोही क्रमबद्ध हों, हालांकि मैं उन पंक्तियों को चाहता हूं जहां सूची के अंत में डेटाटाइम फ़ील्ड शून्य है, शुरुआत में नहीं।

क्या इसे पूरा करने का एक सरल तरीका है?



जवाबों:


394
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate

2
ध्यान दें कि यदि आप प्रदर्शन (*) को बेहतर बनाने के लिए सॉर्ट कॉलम पर एक इंडेक्स लगाते हैं, तो यह विधि क्वेरी प्लान को कुछ हद तक जटिल कर देगी और प्रदर्शन लाभ को बहुत कम कर देगी। * - अनुक्रमित डेटा प्रदान करता है, इसलिए प्रति क्वेरी निष्पादन के प्रकार से परहेज करता है। यदि इस समस्या से पूरी तरह से बचने के लिए संभव हो तो NULL रिकॉर्ड को फ़िल्टर करना उचित है।
Redcalx

2
लाभ और नुकसान के साथ सभी संभव तरीकों के साथ यहाँ दिया गया अच्छा जवाब nickstips.wordpress.com/2010/09/30/…
sudhAnsu63

40
order by case when MyDate is null then 1 else 0 endवास्तव में कहने का एक लंबा तरीका हैORDER BY MyDate IS NULL
मार्टिन

5
@Martin नोट इस प्रश्न को mysql टैग नहीं किया गया है। मैंने एक सामान्यीकृत समाधान प्रदान किया - अलग-अलग डीबीएस में एक ही काम करने के कई अलग-अलग तरीके हैं।
RedFilter

1
@KyleDelaney क्योंकि order by 0कॉलम इंडेक्स के रूप में व्याख्या की जाती है, और कॉलम इंडेक्स 1-आधारित होते हैं। 3 कॉलम द्वारा एक क्वेरी को सॉर्ट करने के लिए आप कह सकते हैं order by 3(जो उत्पादन प्रश्नों के लिए एक भयानक विचार है), लेकिन *प्रयोग करते समय बहुत आसान (जैसा है )।
RedFilter

159

(एक "बिट" देर से, लेकिन यह बिल्कुल उल्लेख नहीं किया गया है)

आपने अपना DBMS निर्दिष्ट नहीं किया।

मानक SQL (और सबसे आधुनिक DBMS जैसे Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB और H2) में आप निर्दिष्ट कर सकते हैं NULLS LASTया NULLS FIRST:

NULLS LASTउन्हें अंत तक छाँटने के लिए उपयोग करें :

select *
from some_table
order by some_column DESC NULLS LAST

16
AFAIK NULLS FIRSTऔर NULLS LASTSQL: 2003 में जोड़ा गया है, लेकिन विभिन्न DMBS में कोई मानक कार्यान्वयन उपलब्ध नहीं है '। डेटाबेस इंजन के आधार पर, ORDER BY expr some_column DESC NULLS LAST(Oracle), ORDER BY ISNULL(some_column, 1), some_column ASC(MSSQL) या ORDER BY ISNULL(some_column), some_column ASC(MySQL wih एक अलग ISNULL () कार्यान्वयन) का उपयोग करें।
शशम .्ग Sas

3
@ SaschaM78: NULLs की डिफ़ॉल्ट छँटाई DBMS निर्भर है। कुछ उन्हें अंत में छाँटते हैं, कुछ शुरुआत में। कुछ के बारे में ASC/ DESCnulls के साथ कुछ परेशान नहीं करते। तो यह सुनिश्चित करने का एकमात्र तरीका है, NULL FIRST/LAST अगर DBMS इसका समर्थन करता है तो इसका उपयोग करना है। यह दस्तावेजों में आप क्या इरादा रखते हैं। isnull()या अन्य कार्यों का उपयोग गुम समर्थन के लिए एक वैकल्पिक हल है NULLS FIRST/LAST(जो कि Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB और H2 द्वारा
सपॉर्ट किया गया है

आप पूरी तरह से सही हैं, मैं बस इस तथ्य को जोड़ना चाहता था कि आसपास कुछ डीबीएमएस हैं जो मानक (अभी तक) का पालन नहीं करते हैं या उनकी विशिष्टताओं जैसे Oracle को exprNULLS FIRST / LAST का उपयोग करते समय कीवर्ड की आवश्यकता होती है । और डेटाबेस प्रकार से अलग-अलग / अंतिम रूप से दिखाए जा रहे नल के बारे में धन्यवाद, पता नहीं था!
शशमग Sas

2
यह आशाजनक लग रहा है, लेकिन दुख की बात है कि मैंने इसकी कोशिश की और NULLS LASTअपने MySQL डेटाबेस में काम नहीं किया।
एडमिरलथ्रॉन

1
@AdmiralAdama: आप हमेशा पोस्टग्रेज में अपग्रेड कर सकते हैं
a_horse_with_no_name

35

मैं भी बस इस पर ठोकर खाई और निम्नलिखित MySQL और PostgreSQL पर मेरे लिए चाल करने के लिए लगता है:

ORDER BY date IS NULL, date DESC

https://stackoverflow.com/a/7055259/496209 पर पाया गया


यह दिखता का वादा, लेकिन दुर्भाग्य से, मैं इसे करने की कोशिश की और IS NULLऔर IS NOT NULLमेरी MySQL डेटाबेस में काम नहीं किया।
एडमिरलथ्रॉन

14
order by coalesce(date-time-field,large date in future)

10
हालांकि यह आम तौर पर काम करेगा, यह ध्यान दिया जाना चाहिए कि इस उत्तर में कुछ मुद्दे हैं: भविष्य में बड़ी तारीख वास्तविक डेटा के साथ टकरा सकती है या कम हो सकती है, जिसके परिणामस्वरूप अपूर्ण रूप हो सकता है। इसके अलावा, यह एक "मैजिक नंबर" समाधान है जो स्व-दस्तावेजीकरण नहीं है।
RedFilter

यह @RedFilter उत्तर के लिए एक बढ़िया विकल्प होता है जब आपको कॉलम की तुलना किसी अन्य तिथि वाले कॉलम से करने की आवश्यकता होती है। मैं संघ की वरिष्ठता सूची के लिए इसका उपयोग करता हूं। यदि कर्मचारी के पास एक योग्य तिथि (जो कि अशक्त है), तो वह तिथि शीर्ष पर दर्ज हो जाती है, अन्यथा HireDate का उपयोग करें। ISNULL (QualifiedDate, '1-1-2099') द्वारा ORDER का उपयोग करना, HireDate, LastName, इत्यादि योग्य तिथि को HiredDate तिथि के साथ विरोधाभास नहीं बनाता है और सही वरिष्ठता सूची का उत्पादन किया जाता है।
एलन फिशर

14

नीचे दिए गए अशक्त या अशक्त की जांच के लिए आप अंतर्निहित फ़ंक्शन का उपयोग कर सकते हैं। मैं इसे और इसके ठीक काम का परीक्षण करता हूं।

select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;


Mssql के साथ काम करने की तारीखों के लिए मुझे ISNULL फंक्शन यानी ISNULL (MyDate, '2100-01-01') में भविष्य की तारीख में एक बहुत ही उपयोगी जगह मिली
Emi-C

MySQL में, यह कहता है कि मैं बहुत सारे मापदंडों से गुजर रहा हूँ। मुझे यह करने के लिए पार्स करने के लिए मिला ISNULL(MyDate) DESC, MyDate ASC, लेकिन यह सही क्रम में हल नहीं हुआ।
एडमिरलथ्रॉन

12

यदि आपका इंजन अनुमति देता है ORDER BY x IS NULL, xया ORDER BY x NULLS LASTइसका उपयोग करता है। लेकिन अगर यह इन मदद नहीं करता है:

यदि आप एक संख्यात्मक प्रकार से छँटाई कर रहे हैं तो आप ऐसा कर सकते हैं: ( दूसरे उत्तर से स्कीमा को उधार लेना ।)

SELECT *          
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;

परिणाम दिखाने के लिए विभाग द्वारा अंतिम nulls के साथ हल

कोई भी गैर-शून्य संख्या 0 हो जाती है, और नल 1 हो जाते हैं, जो अंतिम रूप से अशक्त हो जाते हैं।

आप इसे स्ट्रिंग्स के लिए भी कर सकते हैं:

SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName

अंतिम नामों के साथ अंतिम नाम के अनुसार छंटनी करने वाला परिणाम

क्योंकि 'a'> ''

यह भी तारीखों के साथ काम करता है एक अशक्त int के लिए और ऊपर ints के लिए विधि का उपयोग करके:

SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate

(आइए दिखाते हैं कि स्कीमा में HireDate है।)

ये विधियाँ डेटा प्रकार (और अधिकतम) में परिवर्तन (दोनों अन्य समस्याएँ जो अन्य ISNULL समाधान पीड़ित हैं) के साथ आने वाले प्रश्नों के "अधिकतम" मान के साथ आने या उन्हें ठीक करने के मुद्दे से बचती हैं। इसके अलावा वे एक मामले से बहुत कम हैं।


बहुत अच्छा काम करता है ! धन्यवाद
वाणी

8

जब आपका ऑर्डर कॉलम संख्यात्मक होता है (रैंक की तरह) तो आप इसे -1 से गुणा कर सकते हैं और फिर अवरोही क्रम कर सकते हैं। यह उस आदेश को जारी रखेगा, जिसे आप समाप्त कर रहे हैं, लेकिन NULL को रखें।

select *
from table
order by -rank desc

बस यह टिप्पणी करने वाला था। इसे stackoverflow.com/a/8174026/1193304 से सीखा और यह बहुत अच्छा है
क्रिस


3

धन्यवाद RedFilter nullable डेटाटाइम फ़ील्ड सॉर्ट करने के लिए बगिंग समस्या के लिए उत्कृष्ट समाधान प्रदान करने के लिए।

मैं अपने प्रोजेक्ट के लिए SQL सर्वर डेटाबेस का उपयोग कर रहा हूं।

'1' के लिए डेटटाइम नल मान को परिवर्तित करने से डेटाइम डेटेटाइप कॉलम के लिए सॉर्ट करने की समस्या हल हो जाती है। हालाँकि, अगर हमारे पास डेटाटाइम के अलावा अन्य स्तंभ हैं, तो यह हैंडल करने में विफल रहता है।

एक वर्कर कॉलम सॉर्ट को हैंडल करने के लिए, मैंने 'ZZZZZZZ' का उपयोग करने की कोशिश की क्योंकि मुझे पता था कि कॉलम में 'Z' से शुरू होने वाले मान नहीं हैं। यह उम्मीद के मुताबिक काम किया।

उसी तर्ज पर, मैंने इंट और अन्य डेटा प्रकारों के लिए अधिकतम मान +1 का उपयोग किया जैसा कि अपेक्षित था। इसने मुझे आवश्यकतानुसार परिणाम भी दिए।

हालाँकि, हमेशा डेटाबेस इंजन में ही कुछ आसान करने के लिए आदर्श होगा जो कुछ ऐसा कर सकता है:

Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

जैसा कि a_horse_with_no_name द्वारा दिए गए उत्तर में बताया गया है।


3

Oracle में, आप उपयोग कर सकते हैं NULLS FIRSTया NULLS LAST: निर्दिष्ट करते हैं कि NULL मानों को गैर-NULL मानों से पहले / बाद में लौटाया जाना चाहिए:

ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] }

उदाहरण के लिए:

ORDER BY date DESC NULLS LAST

रेफरी: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html


3

यदि आप MariaDB का उपयोग कर रहे हैं, तो वे NULL मान दस्तावेज़ में निम्नलिखित का उल्लेख करते हैं ।

आदेश

जब आप किसी ऐसे क्षेत्र से ऑर्डर करते हैं जिसमें NULL मान हो सकते हैं, तो किसी भी NULL को न्यूनतम मान माना जाता है। इसलिए DESC के आदेश में NULL को अंतिम दिखाई देगा। NULL को उच्चतम मान के रूप में बाध्य करने के लिए, कोई अन्य स्तंभ जोड़ सकता है जिसका मुख्य फ़ील्ड NULL होने पर उच्च मान हो। उदाहरण:

SELECT col1 FROM tab ORDER BY ISNULL(col1), col1;

अवरोही क्रम, पहले NULLs के साथ:

SELECT col1 FROM tab ORDER BY IF(col1 IS NULL, 0, 1), col1 DESC;

सभी NULL मान DISTINCT और GROUP BY क्लाज के प्रयोजनों के लिए भी समान माने जाते हैं।

ऊपर NULL मान द्वारा ऑर्डर करने के दो तरीके दिखाए गए हैं, आप इन्हें ASC और DESC कीवर्ड के साथ भी जोड़ सकते हैं। उदाहरण के लिए NULL मान प्राप्त करने का दूसरा तरीका होगा:

SELECT col1 FROM tab ORDER BY ISNULL(col1) DESC, col1;
--                                         ^^^^

2

"केस" का उपयोग करके समाधान सार्वभौमिक है, लेकिन फिर इंडेक्स का उपयोग न करें।

order by case when MyDate is null then 1 else 0 end, MyDate

मेरे मामले में, मुझे प्रदर्शन की आवश्यकता थी।

 SELECT smoneCol1,someCol2  
 FROM someSch.someTab
 WHERE someCol2 = 2101 and ( someCol1 IS NULL ) 
  UNION   
 SELECT smoneCol1,someCol2
 FROM someSch.someTab
 WHERE someCol2 = 2101 and (  someCol1 IS NOT NULL)  

1
यदि आप प्रदर्शन में रुचि रखते हैं तो आपको उपयोग करना चाहिए UNION ALL
RedFilter


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