कुछ अन्य डेटाबेस (जैसे Oracle) के विपरीत PostgreSQL में पूरी तरह कार्यात्मक boolean . है प्रकार। आप इसका उपयोग सीधे कर सकते हैं ORDER BY . में एक CASE applying लागू किए बिना खंड कथन - वे अधिक जटिल परिस्थितियों के लिए उपयुक्त हैं।
boolean . के लिए क्रम से लगाएं मान है:
FALSE -> TRUE -> NULL
यदि आप ORDER BY bool_expression DESC , आप ऑर्डर को इसमें उल्टा कर देते हैं:
NULL -> TRUE -> FALSE
अगर आप TRUE चाहते हैं पहला और NULL अंत में, NULLS LAST . का उपयोग करें ORDER BY . का खंड :
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
बेशक, NULLS LAST केवल तभी प्रासंगिक है जब featured या created_at कर सकते हैं NULLहोना . यदि कॉलम परिभाषित हैं NOT NULL , तो परेशान न हों।
साथ ही, FALSE NULL . से पहले सॉर्ट किया जाएगा . यदि आप इन दोनों के बीच अंतर नहीं करना चाहते हैं, तो आप या तो CASE . पर वापस आ गए हैं कथन, या आप NULLIF() in में फेंक सकते हैं या COALESCE() ।
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
प्रदर्शन
ध्यान दें, मैंने कैसे इस्तेमाल किया:
created_at > now() - interval '11 days'
और नहीं :
now() - created_at < interval '11 days'
पहले उदाहरण में, दाईं ओर का व्यंजक एक स्थिरांक है जिसकी गणना एक बार . की जाती है . फिर मिलान पंक्तियों को देखने के लिए एक अनुक्रमणिका का उपयोग किया जा सकता है। बहुत कुशल।
उत्तरार्द्ध का आमतौर पर एक सूचकांक के साथ उपयोग नहीं किया जा सकता है। प्रत्येक पंक्ति के लिए एक मान की गणना की जानी चाहिए, इससे पहले कि इसे निरंतर अभिव्यक्ति के खिलाफ दाईं ओर चेक किया जा सके। अगर आप इससे बच सकते हैं तो ऐसा न करें। कभी!