MySQL ऑर्डरबी एक नंबर, नल अंतिम


279

वर्तमान में मैं अपने बयान में एक बहुत ही बुनियादी ऑर्डरबी कर रहा हूं।

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC

इसके साथ समस्या यह है कि 'स्थिति' के लिए NULL प्रविष्टियों को 0. के रूप में माना जाता है, इसलिए NULL के रूप में स्थिति के साथ सभी प्रविष्टियाँ 1,3,3,4 के साथ दिखाई देती हैं। उदाहरण के लिए:

NULL, NULL, NULL, 1, 2, 3, 4

क्या निम्नलिखित आदेश प्राप्त करने का एक तरीका है:

1, 2, 3, 4, NULL, NULL, NULL.

8
आपको user1052645 के उत्तर पर पुनर्विचार करना चाहिए। यह सरल है, अधिकतम मानों के ज्ञान की आवश्यकता नहीं है, और तेज़ हो सकता है (मानकर मूल्यांकन करना एक फ़ंक्शन कॉल की तुलना में तेज़ हो सकता है)।
स्टीव क्ले

जवाबों:


566

MySQL में nulls को अंतिम रूप से सॉर्ट करने के लिए एक अनिर्दिष्ट वाक्यविन्यास है। कॉलम नाम से पहले माइनस साइन (-) लगाएं और ASC को DESC पर स्विच करें:

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC

यह अनिवार्य रूप से position DESCNULL मानों को अंतिम रखने का विलोम है, लेकिन अन्यथा उसी के समान है position ASC

एक अच्छा संदर्भ यहाँ है http://troels.arvin.dk/db/rdbms#select-order_by


79
यह अविभाजित नहीं है, - col_nameएक अभिव्यक्ति है ( 0 - col_name), जिसे ORDER BY खंड स्वीकार करता है। बेशक यह केवल संख्यात्मक कॉलम के लिए काम करता है।
स्टीव क्ले

7
अच्छा है। के लिए काम करता है dateऔर timeकॉलम भी! (MySQL 5.5)। मुझे लगता है (मैं जाँच करने के लिए आलसी हूँ) यह सभी नंबर-जैसे कॉलम (टाइमस्टैम्प, फ्लोट ...) के लिए काम करता है।
मार्टिन

6
@koral: यह एक सरल (और उपयोगी) गणित की अभिव्यक्ति है जो आदेश को उलट देता है, इसे तब तक नहीं हटाया जाएगा जब तक कि भाषा में नाटकीय रूप से परिवर्तन न हो।
बेल

11
जैसा कि टिप्पणियों से पता चलता है, यह संख्यात्मक, तिथि और समय कॉलम के लिए काम करता है? लेकिन, varchar के बारे में क्या? क्या इसे वर्चर के लिए भी लागू किया जा सकता है? मैंने इसे varchar फ़ील्ड्स पर लागू करने का प्रयास किया, लेकिन आदेश ASC या DESC के उपयोग से भिन्न प्रतीत होता है।
सुमित देसाई

9
क्या यह कॉलम द्वारा आदेश पर संभावित सूचकांक के उपयोग को नहीं रोक पाएगा?
तारिस

305

मैंने इसे सबसे अधिक भाग के लिए एक अच्छा समाधान पाया:

SELECT * FROM table ORDER BY ISNULL(field), field ASC;

6
कार्यों द्वारा आदेश को फिर से परिभाषित किए बिना: SELECT * FROM table ORDER BY ISNULL(field) ASC;(MySQL 5.5)
मार्केल जुआन

5
यह एक बेहतर उपाय है।
रोक क्रालज

4
स्वीकृत समाधान पोस्टग्रैक्कल 9.3 में TIMESTAMP के साथ काम नहीं करता है। यह समाधान करता है ...
kalu

2
अनायास, MySQL फ़ील्ड पर एक इंडेक्स का उपयोग नहीं करेगा जब आप इसन (फ़ील्ड) को क्लॉज द्वारा ऑर्डर में जोड़ते हैं (जब सीमा का उपयोग करते हुए)।
बैरी केली

3
@ लालू: पोस्टग्रैसीक्यू में , एनएलई मान को आरोही क्रम में अंतिम रूप से क्रमबद्ध किया जाता है (और पहली बार अवरोही क्रम में)। और आप बजाय मानक एसक्यूएल क्लॉज काNULLS LASTNULLS FIRST उपयोग करेंगे | यहाँ वर्कअराउंड के बजाय इसे फ्लिप करने के लिए।
एरविन ब्रान्डसेट्टर

23

कुछ इस तरह

SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC

999999999 को इस क्षेत्र के लिए अधिकतम मान के साथ बदलें


3
यह समाधान नाजुक है और आंतरायिक कीड़े हो सकता है
दिमित्री बोगदानोविच


4

आप NULL के उदाहरणों को पहले (जैसे 0 या -1) या अंतिम (एक बड़ी संख्या या एक पत्र) को सॉर्ट करने के लिए स्वैप कर सकते हैं ...

SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2
  FROM tablename
 WHERE visible = 1
 ORDER BY ordered_field2 ASC, id DESC

यह समस्या को हल नहीं करेगा क्योंकि ORDER BY में संदर्भित इंडेक्स SELECT स्टेटमेंट में मानों को बदलने से प्रभावित नहीं होगा, और इससे ऑर्डरिंग सही नहीं होगी। इसके अलावा, COALESCE फ़ंक्शन देखें, जो कि IF फ़ंक्शन के आपके उपयोग के लिए कार्यात्मक रूप से समतुल्य है।
को परिभाषित करता है

यदि आप IF स्टेटमेंट को ठीक से उपनाम देते हैं, तो पंक्तियों को आदेश दिया जाता है जैसा कि आप अपेक्षा करते हैं। मैंने अपना उदाहरण तय किया।
लैंगडन

4

इस क्वेरी का उपयोग करने का प्रयास करें:

SELECT * FROM tablename
WHERE visible=1 
ORDER BY 
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC

केस की जरूरत नहीं। IS NULL 1 तब होता है जब अभिव्यक्ति NULL होती है। देखें पुनर्मिलन का उत्तर
contactmatt

3

आप कर सकते हैं सम्मिलित में अपने NULLs ORDER BYबयान:

select * from tablename
where <conditions>
order by
    coalesce(position, 0) ASC, 
    id DESC

यदि आप चाहते हैं कि NULLs तल पर सॉर्ट करें, तो प्रयास करें coalesce(position, 100000)। ( positionडीबी में अन्य सभी की तुलना में दूसरे नंबर को बड़ा करें ।)


3
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC

6
ओपी को यह कोशिश क्यों करनी चाहिए ? अच्छे उत्तरों में हमेशा एक स्पष्टीकरण होगा कि क्या किया गया था और यह इस तरह से क्यों किया गया था, न केवल ओपी के लिए बल्कि भविष्य के आगंतुकों के लिए एसओ जो इस प्रश्न को ढूंढ सकते हैं और आपके उत्तर को पढ़ सकते हैं।
रिग्सफॉली

2

एक DATEस्तंभ के लिए आप उपयोग कर सकते हैं:


अंतिम समय:

ORDER BY IFNULL(`myDate`, '9999-12-31') ASC

रिक्त अंतिम:

ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC

1

निम्नलिखित परिणाम प्राप्त करने के लिए:

1, 2, 3, 4, NULL, NULL, NULL.

-(minus sign)USe सिंटैक्स, फ़ील्ड नाम से पहले जगह और व्युत्क्रम ऑर्डर_टाइप का उपयोग करें (जैसे: यदि आप ASC ऑर्डर द्वारा ऑर्डर चाहते हैं तो DESC का उपयोग करें या यदि आप DESC ऑर्डर चाहते हैं तो ASC का उपयोग करें)

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC


1

यह ठीक काम कर रहा है:

SELECT * FROM tablename ORDER BY position = 0, position ASC;

position
1 
2
3
0
0

-8

आप NULLS LAST द्वारा ऑर्डर क्यों नहीं करते हैं?

SELECT * 
FROM tablename
WHERE visible = 1 
ORDER BY position ASC NULLS LAST, id DESC 

NULLS LAST- MySQL का कौन सा संस्करण पेश किया गया था?
क्रैम्पिको

2
@Panique, आपका मतलब (MS) SQL सर्वर?
d -_- b

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