sql >> データベース >  >> RDS >> PostgreSQL

Active Record&Railsを使用して空になることがあるORDERBY列

    大文字と小文字の問題が発生しています。名前はすべて大文字ですが、メールは小文字であり、ほとんどの照合では、大文字が小文字の前に表示されます。この簡単な例を確認してください:

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

    したがって、クエリは実際には完全に機能しています。[email protected] Joshの後に並べ替えます 。これを回避するには、小文字の値で並べ替えることができます。所有しているデータの簡単なバージョンは次のとおりです。

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

    次に、coalesceを使用して並べ替えます あなたが求めているのは:

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

    または、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. PostgreSQLの新しいユーザーがすべてのデータベースに接続できるのはなぜですか?

    2. mysqlカウントクエリを最適化する

    3. mysqlfloatから間違った値が返されました

    4. mysqlは自動的に文字列を整数にキャストします