Du støder på et problem med store bogstaver:Dine navne er alle med store bogstaver, men e-mails er små, og med de fleste sorteringer kommer store bogstaver før små bogstaver. Tjek dette trivielle eksempel:
#= 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
Så din forespørgsel fungerer faktisk perfekt, det er bare det example@sqldat.com sorterer efter Josh . For at undgå dette kan du sortere efter små bogstaver. Her er en simpel version af de data, du har:
#= select * from volunteers;
first_name | last_name | email
------------+-----------+--------------------
Josh | Broger | example@sqldat.com
Josh | Kenton | example@sqldat.com
∅ | ∅ | example@sqldat.com
Josh | Broger | example@sqldat.com
Alex | Diego | example@sqldat.com
Derefter sorteres ved hjælp af coalesce du leder efter:
#= select * from volunteers order by lower(coalesce(first_name, email));
first_name | last_name | email
------------+-----------+--------------------
Alex | Diego | example@sqldat.com
∅ | ∅ | example@sqldat.com
Josh | Broger | example@sqldat.com
Josh | Broger | example@sqldat.com
Josh | Kenton | example@sqldat.com
Eller for din fulde version ved hjælp af 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"))')