भले ही अभी 2017 है, लेकिन अभी भी इस बात पर एकमत होना बाकी है कि क्या NULLपूर्वता लेनी चाहिए। आपके द्वारा इसके बारे में स्पष्ट किए बिना, आपके परिणाम DBMS के आधार पर भिन्न हो सकते हैं।
यह मानक निर्दिष्ट नहीं करता है कि गैर-पूर्ण मूल्यों की तुलना में NULL को कैसे आदेश दिया जाना चाहिए, सिवाय इसके कि किसी भी दो NULL को समान रूप से आदेश दिया जाए, और यह कि NULLs सभी गैर-NULL मानों के ऊपर या नीचे क्रमबद्ध करें।
स्रोत, अधिकांश DBMS की तुलना
समस्या का वर्णन करने के लिए, मैंने कुछ सबसे लोकप्रिय मामलों की एक सूची तैयार की, जब यह रेल विकास की बात आती है:
PostgreSQL
NULLउच्चतम मूल्य है।
डिफ़ॉल्ट रूप से, अशक्त मान किसी भी गैर-शून्य मान से बड़े होते हैं।
स्रोत: PostgreSQL प्रलेखन
माई एसक्यूएल
NULLसबसे कम मूल्य है।
जब आप ORDER BY करते हैं, तो NULL मान पहले प्रस्तुत किए जाते हैं यदि आप ORDER BY ... ASC करते हैं और अंतिम यदि आप ORDER BY ... DESC करते हैं।
स्रोत: MySQL प्रलेखन
SQLite
NULLसबसे कम मूल्य है।
एक पूर्ण मान वाली एक पंक्ति आरोही क्रम में नियमित मान वाली पंक्तियों से अधिक है, और यह अवरोही क्रम के लिए उलट है।
स्रोत
उपाय
दुर्भाग्य से, रेल स्वयं इसके लिए कोई समाधान प्रदान नहीं करती है।
PostgreSQL विशिष्ट
PostgreSQL के लिए आप काफी सहजता से उपयोग कर सकते हैं:
Photo.order('collection_id DESC NULLS LAST') # NULLs come last
MySQL विशिष्ट
माईएसक्यूएल के लिए, आप माइनस साइन अपफ्रंट लगा सकते हैं, फिर भी यह सुविधा अनिर्दिष्ट लगती है। न केवल संख्यात्मक मूल्यों के साथ काम करने की अपील करता है, बल्कि तारीखों के साथ भी।
Photo.order('-collection_id DESC') # NULLs come last
PostgreSQL और MySQL विशिष्ट
दोनों को कवर करने के लिए, यह काम करता है:
Photo.order('collection_id IS NULL, collection_id DESC') # NULLs come last
फिर भी, यह SQLite में काम नहीं करता है ।
सार्वभौमिक समाधान
सभी DBMS के लिए क्रॉस-सपोर्ट प्रदान करने के लिए आपको CASE@PhilIT द्वारा पहले से सुझाई गई क्वेरी का उपयोग करना होगा:
Photo.order('CASE WHEN collection_id IS NULL THEN 1 ELSE 0 END, collection_id')
जो पहले CASEपरिणामों में से प्रत्येक रिकॉर्ड को पहले क्रमबद्ध करने का अनुवाद करता है (डिफ़ॉल्ट आरोही क्रम से, जिसका अर्थ है कि NULLमानों में अंतिम होगा), दूसरा calculation_id।