MySQL में ORDER BY ASC डिफ़ॉल्ट रूप से NULL मानों को पहले रखता है। NULL मानों को अंत में (नीचे) रखते हुए आरोही क्रम बनाए रखने के लिए, CASE स्टेटमेंट या IS NULL चेक के साथ कस्टम सॉर्टिंग लागू करें।
उदाहरण: NULL और खाली स्ट्रिंग को नीचे रखें
डेमो टेबल बनाएं:
mysql> CREATE TABLE DemoTable1937 (Name VARCHAR(20));
डेटा इन्सर्ट करें (NULL और खाली स्ट्रिंग सहित):
mysql> INSERT INTO DemoTable1937 VALUES
('Chris'), (NULL), ('Adam'), ('John'), (''), (NULL), ('Bob');
डिफ़ॉल्ट ASC (NULL पहले):
+-------+ | Name | +-------+ | NULL | | NULL | | | | Adam | | Bob | | Chris | | John | +-------+
CASE के साथ कस्टम ऑर्डर (NULL/खाली नीचे):
mysql> SELECT * FROM DemoTable1937
ORDER BY
CASE
WHEN Name IS NULL THEN 100
WHEN Name = '' THEN 101
ELSE 103
END DESC,
Name ASC;
आउटपुट (मान ASC, फिर खाली, फिर NULL):
+-------+ | Name | +-------+ | Adam | | Bob | | Chris | | John | | | | NULL | | NULL | +-------+
व्याख्या
CASEप्रत्येक पंक्ति को सॉर्ट प्राथमिकता देता है:- वैध नाम → 103 (उच्चतम)
- खाली स्ट्रिंग → 101
- NULL → 100 (निम्नतम)
DESC: उच्च प्राथमिकता पहले (103 > 101 > 100)Name ASC: समान प्राथमिकता वाले समूह के भीतर वर्णानुक्रम
सरल विकल्प: IS NULL सॉर्टिंग
-- केवल NULL अंत में ORDER BY Name IS NULL, Name ASC -- NULL और खाली दोनों अंत में ORDER BY (Name IS NULL OR Name = ''), Name ASC
MySQL में TRUE=1, FALSE=0, इसलिए IS NULL (1) बाद में आता है ASC में।
MySQL 8.0+ NULLS FIRST/LAST (समर्थित नहीं)
PostgreSQL/Oracle: ORDER BY Name ASC NULLS LAST
MySQL: उपरोक्त CASE/बूलियन ट्रिक उपयोग करें।
इंडेक्स विचार
ORDER BY Nameइंडेक्स उपयोग कर सकता हैORDER BY CASE...आमतौर पर फाइलसॉर्ट मजबूर करता है- बड़े टेबल्स के लिए,
Nameपर इंडेक्स + एप्लिकेशन लेयर सॉर्टिंग पर विचार करें
सामान्य पैटर्न
-- संख्यात्मक: 0/NULL अंत में ORDER BY (col IS NULL OR col = 0), col ASC -- तारीख: भविष्य/NULL अंत में ORDER BY (dt IS NULL OR dt > CURDATE()), dt ASC
कस्टम NULL सॉर्टिंग रिपोर्टिंग और UI डिस्प्ले के लिए आवश्यक है जहां NULL का अर्थ "अज्ञात/लागू नहीं" होता है।