নির্দিষ্ট ক্রমে একাধিক মান দ্বারা স্কয়ার অর্ডার?


99

ঠিক আছে আমার একটি ইনডেক্সড কী এবং একটি নীতি নির্ধারিত ক্ষেত্র সহ একটি টেবিল আছে। আমাকে একটি নির্দিষ্ট মান সহ সমস্ত রেকর্ড সন্ধান করতে হবে এবং সারিটি ফিরিয়ে আনতে হবে। আমি একাধিক মান দিয়ে অর্ডার করতে পারি কিনা তা জানতে চাই।

উদাহরণ:

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 রেকর্ডে সীমাবদ্ধ রাখি। এই সম্পর্কে আরও কিছু উপায় আছে?

এক্স_ফিল্ডকে পরীক্ষার ফলাফল হিসাবে ভাবেন এবং শর্তে পড়ে থাকা সমস্ত রেকর্ডকে আমার যাচাই করতে হবে। আমি ব্যর্থ মান, পাস করা মান দ্বারা পরীক্ষার ফলাফল অর্ডার করতে চেয়েছিলাম। সুতরাং আমি প্রথমে ব্যর্থ মানগুলি এবং তারপরে অর্ডার বাই ব্যবহার করে পাস করা মানগুলি যাচাই করতে পারি।

আমি যা করতে পারি না:

  • আমার দ্বারা গ্রুপ, যেমন আমার সুনির্দিষ্ট রেকর্ড মানগুলি ফিরিয়ে নেওয়া দরকার
  • যেখানে এক্স_ফিল্ড ইন ('চ', 'পি', 'আই', 'এ'), আমার বেশিরভাগ মান দরকার কারণ আমি বেশ কয়েকটি বৈধতা পরীক্ষার জন্য একটি ক্যোয়ারী ব্যবহার করার চেষ্টা করছি। এবং এক্স_ফিল্ডের মানগুলি ডিইএসসি / এএসসি অর্ডারে নেই

এই প্রশ্নটি লেখার পরে আমি ভাবতে শুরু করি যে এটি নিয়ে আমার পুনর্বিবেচনা করা দরকার, এলএল!


পরিবর্তে একটি ইউনিয়ন হতে পারে? আপনি যে ফলাফলটি ফিরে আসতে চান তার জন্য পৃথক প্রশ্ন তৈরি করুন, তারপরে those কোয়েরিগুলির একটি ইউনিয়ন করবেন?
কিনকুট

উত্তর:


189
...
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)" সহ একটি বাম যোগদান করতে পারেন এবং আপনার ক্রমে দ্বিতীয় কলামটি ব্যবহার করতে পারেন -প্রকাশ দ্বারা। পোস্টগ্র্রেসগুলি হ্যাশ জোড় ব্যবহার করবে যা আপনার প্রচুর মান থাকলে একটি বিশাল CASE এর চেয়ে অনেক দ্রুত হবে। এবং এটি স্বয়ংক্রিয়ভাবে তৈরি করা সহজ।

যদি এই অর্ডারিংয়ের তথ্য স্থির হয় তবে তার নিজস্ব টেবিলটি থাকা উচিত।


6
এটি এখন পর্যন্ত সবচেয়ে মার্জিত সমাধান!
jnns

28

চেষ্টা করুন:

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

আপনি সঠিক পথে ছিলেন, তবে কেবল এক্স-ফিল্ডটি কেবলমাত্র এফ মানটিতে রেখে, অন্য 3 জনকে ধ্রুবক হিসাবে বিবেচনা করা হয়েছিল এবং ডেটাসেটের কোনও কিছুর বিপরীতে তুলনা করা হয়নি।


পোস্টগ্রিস কি অন্তর্নিহিত বুলিয়ান সমর্থন করে? যদি তা হয়, কিভাবে বুলিয়ান বাছাই করে?
জিবিএন

আমি এই সমাধানটি পছন্দ করেছি কিন্তু এটি আর কিছু ফেরত দেয় না।
ফিল প্যাফোর্ড

@gbn, হ্যাঁ এবং মিথ্যা <সত্য। আমি এই কাজ করবে আশা করতেন।
অ্যান্ড্রু লাজার

7
হ্যাঁ, এটি পোস্টগ্র্রেসে ইভেন্ট কাজ করে। এই সমাধানটিতে দ্রষ্টব্য হ'ল আপনি বিপরীত ক্রমে ফলাফল অনুসারে বাছাই করেছেন। সুতরাং আপনাকে ক্ষেত্রগুলি বিপরীত ক্রমে রাখতে হবে: অর্ডার বাই এক্স_ফিল্ড = 'এ', এক্স_ফিল্ড = 'আমি', এক্স_ফিল্ড = 'পি', এক্স_ফিল্ড = 'এফ',
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

11

আমি এর জন্য অনেক ক্লিনার সমাধান পেয়েছি:

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

দ্রষ্টব্য: অ্যারে_পজিশনের জন্য v9.5 বা তার বেশি পোস্টগ্রিজ দরকার।


4
গুরুত্বপূর্ণ যে অ্যারে_পজিশন () কেবল পোস্টগ্রাস ভি 9.5 এর পরে পাওয়া যায়, আফিক্স।
বিগসি

ধন্যবাদ, অনেকটা এটিকে CASE পদ্ধতিতে পছন্দ করেছে। পূর্ণসংখ্যার সাথেও কাজ করে; 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

ফলাফলটি "ইসগেন = 0" সারি দিয়ে শুরু হওয়া একটি তালিকা হবে, তার পরে "ইসজেন = 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

কেউ কাছে নতুন জন্য আদেশ দ্বারা সঙ্গে ক্ষেত্রে এই দরকারী হতে পারে

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

-2

সিকোয়েন্স অর্ডার করার জন্য আপনি অবস্থান (পাঠ্যের পাঠ্য) ব্যবহার করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.