sql >> Base de Datos >  >> RDS >> PostgreSQL

ORDENAR POR columnas que a veces están vacías usando Active Record &Rails

Se está encontrando con un problema de mayúsculas y minúsculas:sus nombres están en mayúsculas, pero los correos electrónicos están en minúsculas y, en la mayoría de las intercalaciones, las letras mayúsculas van antes que las minúsculas. Mira este ejemplo trivial:

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

Entonces, su consulta funciona perfectamente, es solo que [email protected] ordena después de Josh . Para evitar esto, puede ordenar por el valor en minúsculas. Esta es una versión simple de los datos que tiene:

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

Luego, para ordenar usando coalesce buscas:

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

O para su versión completa usando 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"))')