विशिष्ट क्रम में कई मानों द्वारा sql आदेश?


94

ठीक है मैं एक अनुक्रमित कुंजी और एक गैर अनुक्रमित क्षेत्र के साथ एक मेज है। मुझे एक निश्चित मूल्य के साथ सभी रिकॉर्ड खोजने और पंक्ति को वापस करने की आवश्यकता है। मैं जानना चाहूंगा कि क्या मैं कई मूल्यों द्वारा आदेश दे सकता हूं।

उदाहरण:

id     x_field
--     -----
123    a
124    a
125    a
126    b
127    f
128    b
129    a
130    x
131    x
132    b
133    p
134    p
135    i

छद्म: परिणाम इस तरह से आदेश दिया जाना चाहते हैं, where ORDER BY x_field = 'f', 'p', 'i', 'a'

SELECT *
FROM table
WHERE id NOT IN (126)
ORDER BY x_field 'f', 'p', 'i', 'a'

तो परिणाम होगा:

id     x_field
--     -----
127    f
133    p
134    p
135    i
123    a
124    a
125    a
129    a

वाक्यविन्यास मान्य है, लेकिन जब मैं क्वेरी को निष्पादित करता हूं तो यह कभी भी कोई परिणाम नहीं देता है, भले ही मैं इसे 1 रिकॉर्ड तक सीमित करता हूं। क्या इस बारे में जाने का कोई और तरीका है?

X_field को परीक्षा परिणाम के रूप में सोचें और मुझे उन सभी रिकॉर्डों को मान्य करने की आवश्यकता है जो स्थिति में आते हैं। मैं असफल मूल्यों, उत्तीर्ण मूल्यों द्वारा परीक्षा परिणाम का आदेश देना चाहता था। इसलिए मैं पहले असफल मानों को मान्य कर सकता था और फिर ORDER BY का उपयोग करके उत्तीर्ण मानों को।

मैं क्या नहीं कर सकता:

  • ग्रुप बाय, जैसा कि मुझे विशिष्ट रिकॉर्ड मूल्यों को वापस करने की आवश्यकता है
  • जहां x_field IN ('f', 'p', 'i', 'a'), मुझे सभी मानों की आवश्यकता है क्योंकि मैं कई सत्यापन परीक्षणों के लिए एक क्वेरी का उपयोग करने की कोशिश कर रहा हूं। और x_field मान DESC / ASC क्रम में नहीं हैं

इस प्रश्न को लिखने के बाद मुझे लगने लगा है कि मुझे इस पर पुनर्विचार करने की आवश्यकता है, LOL!


शायद इसके बजाय एक संघ? आप जिस क्रम में परिणाम लौटना चाहते हैं, उस क्रम में अलग-अलग प्रश्नों का निर्माण करें, फिर उन प्रश्नों का एक संघ करें?
किनाकुटा

जवाबों:


180
...
WHERE
   x_field IN ('f', 'p', 'i', 'a') ...
ORDER BY
   CASE x_field
      WHEN 'f' THEN 1
      WHEN 'p' THEN 2
      WHEN 'i' THEN 3
      WHEN 'a' THEN 4
      ELSE 5 --needed only is no IN clause above. eg when = 'b'
   END, id

29

आप "VALUES ('f', 1), ('p', 2), ('a', 3), ('i', 4)" के साथ एक LEFT JOIN का उपयोग कर सकते हैं और अपने क्रम में दूसरे कॉलम का उपयोग कर सकते हैं -तब अभिव्यक्ति। पोस्टग्रैज एक हैश ज्वाइन का उपयोग करेगा जो कि बहुत अधिक CASE की तुलना में अधिक तेज़ होगा यदि आपके पास बहुत सारे मान हैं। और ऑटोजेनरेट करना आसान है।

यदि यह आदेश देने वाली जानकारी निर्धारित है, तो इसकी अपनी तालिका होनी चाहिए।


6
यह अब तक का सबसे सुरुचिपूर्ण समाधान है!
jnns

26

प्रयत्न:

ORDER BY x_field='F', x_field='P', x_field='A', x_field='I'

आप सही रास्ते पर थे, लेकिन केवल मूल्य पर x_field लगाकर, अन्य 3 को स्थिरांक के रूप में माना गया और डेटासेट में किसी भी चीज़ के खिलाफ तुलना नहीं की गई।


क्या Postgres का मतलब अंतर्निहित बूलियन है? यदि हां, तो बूलियन कैसे सॉर्ट करता है?
गब्बर

मुझे यह समाधान पसंद आया लेकिन यह फिर से वापस नहीं आया।
फिल पाफर्ड

@ जी हां, और गलत <सच है। मुझे उम्मीद थी कि यह काम करेगा।
एंड्रयू लाजर

6
हाँ, यह Postgres में काम करता है। इस समाधान पर ध्यान दें कि आपको उल्टे क्रम में हल किए गए परिणाम मिलते हैं। इसलिए आपको रिवर्स ऑर्डर में फ़ील्ड्स डालनी होंगी: ORDER BY x_field = 'A', x_field = 'I', x_field = 'P', x_field = 'F',
igo

16

caseकोडों को क्रमबद्ध करने के लिए एक स्विच का उपयोग करें जिन्हें क्रमबद्ध किया जा सकता है:

ORDER BY
  case x_field
  when 'f' then 1
  when 'p' then 2
  when 'i' then 3
  when 'a' then 4
  else 5
  end

10

मुझे इसके लिए एक बहुत अधिक क्लीनर समाधान मिला:

ORDER BY array_position(ARRAY['f', 'p', 'i', 'a']::varchar[], x_field)

नोट: array_position को पोस्टग्रेज v9.5 या उच्चतर की जरूरत है।


1
यह ध्यान रखना महत्वपूर्ण है कि array_position () केवल Postgres v9.5 में उपलब्ध है, आगे।
बिगसी

धन्यवाद, इस मामले के तरीकों के लिए बहुत पसंद किया। पूर्णांक के साथ भी काम करता है; array_position(ARRAY[1, 0]::integer[], x_field)
पॉल वाटसन

7

CASEऔर ORDER BYसुझाव सब काम करना चाहिए, लेकिन मैं एक अलग रंग का एक घोड़ा सुझाव देने के लिए जा रहा हूँ। यह मानते हुए कि मूल्यों के लिए केवल एक उचित संख्या है x_fieldऔर आप पहले से ही जानते हैं कि वे क्या हैं, एफ, पी, ए और मैं मानों के साथ एक एन्यूमरेटेड प्रकार बनाएं (प्लस जो भी अन्य संभावित मूल्य लागू होते हैं)। एनम अपने आदेश से निहित आदेश में क्रमबद्ध करेंगे CREATE। इसके अलावा, आप अर्थपूर्ण नाम का उपयोग कर सकते हैं - आपका वास्तविक अनुप्रयोग संभवतः करता है और आपने उन्हें केवल गोपनीयता के लिए मास्क किया है - बिना व्यर्थ किए स्थान के बाद से, केवल क्रमिक स्थिति संग्रहीत है।


1

आप एक चयनित कॉलम या अन्य भावों से ऑर्डर कर सकते हैं।

यहां एक उदाहरण, केस-स्टेटमेंट के परिणाम के आधार पर ऑर्डर करने का तरीका:

  SELECT col1
       , col2
    FROM tbl_Bill
   WHERE col1 = 0
ORDER BY -- order by case-statement
    CASE WHEN tbl_Bill.IsGen = 0 THEN 0
         WHEN tbl_Bill.IsGen = 1 THEN 1
         ELSE 2 END

परिणाम "IsGen = 0" पंक्तियों के साथ शुरू होने वाली एक सूची होगी, जिसके बाद "IsGen = 1" पंक्तियाँ और अंत में अन्य सभी पंक्तियाँ होंगी।

आप अंत में अधिक ऑर्डर-पैरामीटर जोड़ सकते हैं:

  SELECT col1
       , col2
    FROM tbl_Bill
   WHERE col1 = 0
ORDER BY -- order by case-statement
    CASE WHEN tbl_Bill.IsGen = 0 THEN 0
         WHEN tbl_Bill.IsGen = 1 THEN 1
         ELSE 2 END,
         col1,
         col2

हालांकि यह कोड स्निपेट समस्या को हल कर सकता है, यह इस बात की व्याख्या नहीं करता है कि यह प्रश्न का उत्तर क्यों या कैसे देता है। कृपया अपने कोड के लिए एक स्पष्टीकरण शामिल करें , क्योंकि यह वास्तव में आपके पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
सैमुअल फिलिप

0

किसी के लिए जो CASE के साथ ORDER BY के लिए नया है, यह उपयोगी हो सकता है

ORDER BY 
    CASE WHEN GRADE = 'A' THEN 0
         WHEN GRADE = 'B' THEN 1
         ELSE 2 END

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