У меня есть запрос как это:
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
Я считаю, что общим решением является использование внутреннего SELECT для вычисления (или оператора CASE в данном случае), чтобы результат внутреннего SELECT был доступен для всего внешнего запроса к тому времени, когда выполнение дойдет до этого запроса. В противном случае сначала оценивается пункт WHERE, который ничего не знает о пункте SELECT.