PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Kolumny ORDER BY, które czasami są puste przy użyciu Active Record i Rails

Masz problem z wielkością liter:Twoje imiona są pisane wielkimi literami, ale w wiadomościach e-mail pisane są małymi literami, a w przypadku większości sortowań wielkie litery poprzedzają małe. Sprawdź ten trywialny przykład:

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

Twoje zapytanie działa idealnie, chodzi tylko o to, że [email protected] sortuje za Josh . Aby tego uniknąć, możesz sortować według wartości małych liter. Oto prosta wersja posiadanych danych:

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

Następnie posortuj za pomocą coalesce szukasz:

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

Lub dla pełnej wersji za pomocą 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pula połączeń Postgres — wielu użytkowników

  2. Plan wyjaśniania SQL:co to jest Materialise?

  3. Dlaczego usunięcie indeksu trwa dłużej niż jego utworzenie?

  4. Jak mogę przechwycić zdarzenia transakcji JTA i uzyskać odniesienie do aktualnego EntityManager powiązanego z transakcją?

  5. Uzyskaj nazwę tabeli źródłowej wiersza podczas zapytania rodzica, z którego dziedziczy