PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list の解消

こんにちは!kossyです!




さて、今回はPostgreSQLで遭遇する、PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list の解消方法について、
ブログに残してみたいと思います。



環境

PostgreSQL 12系



実装

以下のようなクエリがあると、must appear in select list のエラーが発生します。

  scope :error_distinct, -> () {
    query = <<-SQL.squish
      SELECT DISTINCT to_char(emp.created_at, 'YYYY-MM-DD')
      FROM employees AS emp
      LEFT JOIN orders ON orders.employee_id = emp.id
      ORDER BY created_at
    SQL

    find_by_sql(query)
  }

to_charで指定した列はそのままORDER BY で使えないんですね、、、

この場合はto_charで算出した列に AS 句で別名を付ければOKです。

  scope :success_distinct, -> () {
    query = <<-SQL.squish
      SELECT DISTINCT to_char(emp.created_at, 'YYYY-MM-DD') AS chared_created_at
      FROM employees AS emp
      LEFT JOIN orders ON orders.employee_id = emp.id
      ORDER BY chared_created_at
    SQL

    find_by_sql(query)
  }

これで問題なく処理できます。