Anda mengalami masalah huruf besar:Nama Anda semua ditulis dengan huruf besar, tetapi emailnya menggunakan huruf kecil, dan dengan sebagian besar susunan, huruf besar ada sebelum huruf kecil. Lihat contoh sepele ini:
#= 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
Jadi kueri Anda sebenarnya berfungsi dengan baik, hanya saja cxxr@person.com
urutkan setelah Josh
. Untuk menghindari hal ini, Anda dapat mengurutkan berdasarkan nilai huruf kecil. Berikut adalah versi sederhana dari data yang Anda miliki:
#= select * from volunteers;
first_name | last_name | email
------------+-----------+--------------------
Josh | Broger | jcool@person.com
Josh | Kenton | aj@person.com
∅ | ∅ | cxxr@person.com
Josh | Broger | broger@person.com
Alex | Diego | a.diego@person.com
Kemudian untuk mengurutkan menggunakan coalesce
Anda mengejar:
#= select * from volunteers order by lower(coalesce(first_name, email));
first_name | last_name | email
------------+-----------+--------------------
Alex | Diego | a.diego@person.com
∅ | ∅ | cxxr@person.com
Josh | Broger | broger@person.com
Josh | Broger | jcool@person.com
Josh | Kenton | aj@person.com
Atau untuk versi lengkap Anda menggunakan 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"))')