आप एक पत्र मामले की समस्या में भाग रहे हैं:आपके नाम सभी बड़े अक्षरों में हैं, लेकिन ईमेल लोअरकेस हैं, और अधिकांश कॉलेशन के साथ, अपरकेस अक्षर लोअरकेस से पहले आते हैं। इस तुच्छ उदाहरण को देखें:
#= select * from (values ('b'), ('B'), ('a'), ('A')) t (letter);
letter
--------
b
B
a
A
#= select * from (values ('b'), ('B'), ('a'), ('A')) t (letter) order by letter;
letter
--------
A
B
a
b
तो आपकी क्वेरी वास्तव में पूरी तरह से काम कर रही है, बस [email protected]
है। ए> Josh
. के बाद छाँटें . इससे बचने के लिए, आप लोअरकेस मान के आधार पर छाँट सकते हैं। यहां आपके पास मौजूद डेटा का एक सरल संस्करण है:
#= select * from volunteers;
first_name | last_name | email
------------+-----------+--------------------
Josh | Broger | [email protected]
Josh | Kenton | [email protected]
∅ | ∅ | [email protected]
Josh | Broger | [email protected]
Alex | Diego | [email protected]
फिर coalesce
. का उपयोग करके सॉर्ट करने के लिए आप इसके बाद हैं:
#= select * from volunteers order by lower(coalesce(first_name, email));
first_name | last_name | email
------------+-----------+--------------------
Alex | Diego | [email protected]
∅ | ∅ | [email protected]
Josh | Broger | [email protected]
Josh | Broger | [email protected]
Josh | Kenton | [email protected]
या ActiveRecord
. का उपयोग करके अपने पूर्ण संस्करण के लिए :
Volunteer
.joins(:volunteer_lists)
.where(
"(volunteer_lists.organizer_id = ? AND organizer_type = 'Organization') OR (volunteer_lists.organizer_id IN (?) AND organizer_type = 'Collaborative')",
organization.id, collaboratives
)
.order('LOWER(COALESCE("volunteers"."first_name", "volunteers"."last_name", "volunteers"."email"))')