sql >> Database >  >> RDS >> PostgreSQL

ORDER BY kolommen die soms leeg zijn met Active Record &Rails

Je hebt te maken met een probleem met hoofdletters:je namen worden allemaal met een hoofdletter geschreven, maar de e-mails zijn in kleine letters, en bij de meeste sorteringen komen hoofdletters voor kleine letters. Bekijk dit triviale voorbeeld:

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

Dus uw zoekopdracht werkt eigenlijk perfect, het is alleen dat [email protected] sorteert na Josh . Om dit te voorkomen, kunt u sorteren op kleine letters. Hier is een eenvoudige versie van de gegevens die je hebt:

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

Om vervolgens te sorteren met behulp van de coalesce je zoekt:

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

Of voor uw volledige versie met 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. SQL Server meldt 'Ongeldige kolomnaam', maar de kolom is aanwezig en de query werkt via beheerstudio

  2. Mysql:vind rijen waar de kolomwaarde eindigt met een specifieke subtekenreeks

  3. Epochenummer omzetten in voor mensen leesbare datum in mysql

  4. Kolommen toevoegen aan een bestaande tabel in SQL Server-database