1. ホーム
  2. sql

[解決済み] PostgresqlのWhere句でAliasカラムを使用する。

2023-05-12 07:16:17

質問

このようなクエリがあります。

SELECT
    jobs.*, 
    (
        CASE
            WHEN lead_informations.state IS NOT NULL THEN lead_informations.state
            ELSE 'NEW'
        END
    ) AS lead_state
FROM
    jobs
    LEFT JOIN lead_informations ON
        lead_informations.job_id = jobs.id
        AND
        lead_informations.mechanic_id = 3
WHERE
    lead_state = 'NEW'

となり、以下のようなエラーが発生します。

PGError: ERROR:  column "lead_state" does not exist
LINE 1: ...s.id AND lead_informations.mechanic_id = 3 WHERE (lead_state...

MySql ではこれは有効ですが、Postgresql ではどうやらそうではありません。私が調べたところでは、その理由は SELECT の部分よりも後に評価されるからです。 WHERE 部分よりも後に評価されます。この問題に対する一般的な回避策はあるのでしょうか?

どのように解決するのですか?

MySQL のサポートは、あなたが経験したように、非標準です。 正しい方法は、SELECT句で使用されているのと同じ式を再表示することです。

SELECT
    jobs.*, 
    CASE 
         WHEN lead_informations.state IS NOT NULL THEN lead_informations.state 
         ELSE 'NEW' 
    END AS lead_state
FROM
    jobs
    LEFT JOIN lead_informations ON
        lead_informations.job_id = jobs.id
        AND
        lead_informations.mechanic_id = 3
WHERE
    lead_informations.state IS NULL