RailsでSQL直書きでCASE文を書いてみる

こんにちは!kossyです!




さて、今回はRailsSQL直書きでCASE文を書いてみたので、ブログに残してみたいと思います。



環境

Rails 6.0.3.4
Ruby 2.6.6
PostgeSQL 12
Docker For Mac




前提

以前書いた拙著のテーブル構成を例にとります。

kossy-web-engineer.hatenablog.com




ごくごく簡単な例を書いてみました。

  scope :listed_employees, -> () {
    query = <<-SQL
      SELECT id, retired_at,
      CASE
        WHEN retired_at IS NULL THEN last_name || first_name
        ELSE last_name || first_name || '(退職済み)'
      END as name
      FROM employees
      ORDER BY id ASC
    SQL

    find_by_sql(query)
  }

retired_atがNULLでなければ、名前の最後に(退職済み)と記載するようにしています。
そしてヒアドキュメントで書いたクエリをfind_by_sqlメソッドで呼び出しています。

次はフラグをつける例です。

  scope :added_retired_flag_employees, -> () {
    query = <<-SQL
      SELECT id, retired_at,
      CASE
        WHEN retired_at IS NULL THEN 0
        ELSE 1
      END as retire_flag
      FROM employees
      ORDER BY id ASC
    SQL

    find_by_sql(query)
  }

retired_atがnullなら0を、nullでなければ1を出力しています。
このように、CASE文でフラグをつけるような使い方もできます。




勉強になりました。



大いに参考にさせていただいたサイト

この場を借りて御礼を申し上げます。

CASE式で条件分岐をSQL文に任せる - Qiita