sql >> Databasteknik >  >> RDS >> PostgreSQL

ORDER BY kolumner som ibland är tomma med Active Record &Rails

Du stöter på ett problem med skiftlägen:Alla dina namn är versaler, men e-postmeddelandena är gemener, och med de flesta sorteringar kommer stora bokstäver före gemener. Kolla in detta triviala exempel:

#= 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 fråga fungerar faktiskt perfekt, det är bara det [email protected] sorterar efter Josh . För att undvika detta kan du sortera efter gemener. Här är en enkel version av den information du har:

#= 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]

Sedan för att sortera med coalesce du är ute efter:

#= 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]

Eller för din fullständiga version med 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"))')


  1. Docker-composes mariadb kan inte starta om efter ändring (exitkod 1)

  2. Jag kan inte ladda JDBC-drivrutinen för MySQL

  3. Bästa sättet att hämta de sista 4 raderna från en resultatuppsättning med mysql

  4. VAR AKTUELL AV i PL/SQL