2010-11-03 22 views
31

द्वारा कस्टम आदेश मैं कुछ समय पहले इस पाया जाता है और बाद से यह उपयोग कर रहा है; हालांकि, आज इसे देखते हुए, मुझे एहसास हुआ कि मैं पूरी तरह समझ नहीं पा रहा हूं कि यह क्यों काम करता है। क्या कोई मेरे लिए कुछ प्रकाश डाल सकता है?स्पष्टीकरण

ORDER BY s.type!= 'Nails', 
      s.type!= 'Bolts', 
      s.type!= 'Washers', 
      s.type!= 'Screws', 
      s.type!= 'Staples', 
      s.type!= 'Nuts', ... 

अगर मैं s.type द्वारा आदेश, यह वर्णानुक्रम आदेश देती है। यदि मैं ऊपर दिए गए उदाहरण का उपयोग करता हूं तो यह लाइन की स्थिति के समान क्रम का उपयोग करता है। जो मुझे समझ में नहीं आता है उसका उपयोग है! =। अगर मैं इसका उपयोग करता हूं = यह विपरीत क्रम में प्रकट होता है। मैं इस अवधारणा के चारों ओर अपने सिर को लपेट नहीं सकता।

यह मेरे लिए कारण होगा कि = = के ऊपर की जगह = नाखून पहले स्थिति में रखेगा, लेकिन ऐसा नहीं होता है, यह इसे अंतिम में रखता है। मुझे लगता है कि मेरा सवाल यह है: मुझे इस स्थिति में क्यों उपयोग करना है! =, नहीं =?

+14

तो, अगर मैं कुछ समझ में नहीं आता है, भले ही मैं सुंदरता और एक समाधान की सादगी पसंद है, मैं अपने हाथ मेरी कानों के ऊपर रखें और दोहराने "ला, ला, ला चाहिए "। मुझे यह दृष्टिकोण पसंद नहीं है; मैं कुछ नया सीखूंगा और इसके साथ सहज महसूस करूंगा। –

उत्तर

23

मैं इसे कभी नहीं देखा है, लेकिन यह समझ बनाने के लिए लगता है।

पहले यह s.type != 'Nails' द्वारा आदेश दिया गया था। यह हर उस पंक्ति type कॉलम में Nails शामिल false है। इसके बाद इसे Bolts द्वारा क्रमबद्ध किया जाता है। फिर सभी स्तंभों है कि Bolts एक type इस गलत का आकलन के रूप में होते हैं। और इसी तरह।

एक छोटा परीक्षण बताता है कि falsetrue से पहले आदेश दिया गया है। तो आप निम्नलिखित है: सबसे पहले आप शीर्ष पर Nails साथ सभी पंक्तियां प्राप्त क्योंकि अनुसार ORDER BYfalse और false के लिए मूल्यांकन पहले आता है। शेष पंक्तियों को दूसरे ORDER BY मानदंड द्वारा क्रमबद्ध किया जाता है। और इसी तरह।

 
type  | != Nails | != Bolts | != Washers 
'Nails' | false | true  | true 
'Bolts' | true  | false | true 
'Washers' | true  | true  | false 
+1

NULLs को मत भूलना। –

+1

यह पूरी तरह से एक विचार है। लेकिन मुझे लगता है कि यह 0 और 1 के सम्मानित पूर्णांक मानों के कारण सत्य से पहले झूठी आदेश देता है, जहां 0 (झूठा) 1 (सत्य) से पहले आता है। –

41

प्रत्येक अभिव्यक्ति एक bool के रूप में मूल्यांकन और सच के लिए झूठे और 1 के लिए 0 के रूप में इलाज और उचित रूप से हल कर दिया जाता है। भले ही यह काम करता है, तर्क का पालन करना मुश्किल है (और इस प्रकार बनाए रखें)। मैं जो उपयोग करता हूं वह एक ऐसा फ़ंक्शन है जो किसी सरणी में मान का सूचकांक पाता है।

ORDER BY idx(array['Nails','Bolts','Washers','Screws','Staples','Nuts'], s.type) 

यह पालन करना बहुत आसान है। नाखूनों को पहले क्रमबद्ध किया जाएगा और पागल आखिरी क्रमबद्ध किया जाएगा। आप पोस्टग्रेस स्निपेट्स रिपोजिटरी में idx फ़ंक्शन कैसे बना सकते हैं, यह देख सकते हैं। http://wiki.postgresql.org/wiki/Array_Index

+2

हो 'केवल 9.5 पर –

+1

@EbenGeer array_position' चाहिए और – DarkMukke

15

@Scott Bailey ने अच्छा विचार सुझाया। लेकिन PostgreSQL 9.5 के बाद से यह भी आसान हो सकता है (आपको कस्टम फ़ंक्शन बनाना नहीं है)।

ORDER BY array_position(array['Nails','Bolts','Washers','Screws','Staples','Nuts'], s.type) 
+0

ऊपर इस उत्तर बस मुझे बहुत काम बचा लिया। धन्यवाद! –

+0

ने मेरे देव उदाहरण पर कोशिश की, यह बहुत अच्छा था, उत्पादन अभी भी 9.3 पर ..इतना अच्छा नहीं – DarkMukke

+2

यह 'टेक्स्ट' प्रकार के कॉलम पर लागू होता है, मैंने इसे कॉलम प्रकार' वर्ण' के साथ करने की कोशिश की और फ़ंक्शन ने एक त्रुटि फेंक दी - उम्मीद है कि यह मदद करता है :) –

1

array_position के साथ, यह एक ही प्रकार है कि आप के खिलाफ की क्वेरी रहे हैं की जरूरत है: बस array_position समारोह का उपयोग करें।

जैसे:

select array_position(array['foo'::char,'bar','baz'::char], 'bar'); 
select array_position(array['foo'::char,'bar','baz'::char], 'baz'::char); 
संबंधित मुद्दे