Используя столбец Alias в, где пункт в Postgresql

У меня есть запрос как это:

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 часть. Существует ли общее обходное решение для этой проблемы?

60
задан Dai 26 January 2018 в 01:29
поделиться

2 ответа

Поддержка 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
14
ответ дан 24 November 2019 в 17:48
поделиться

Я считаю, что общим решением является использование внутреннего SELECT для вычисления (или оператора CASE в данном случае), чтобы результат внутреннего SELECT был доступен для всего внешнего запроса к тому времени, когда выполнение дойдет до этого запроса. В противном случае сначала оценивается пункт WHERE, который ничего не знает о пункте SELECT.

1
ответ дан 24 November 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: