복붙노트

[SQL] PostgreSQL을의 경우 절에 별칭 컬럼을 사용하여

SQL

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 부분에 비해 평가이다. 이 문제에 대한 일반적인 해결 방법이 있습니까?

해결법

  1. ==============================

    1.당신이 표준이 아닌 경험으로 MySQL을 지원이다. 올바른 방법은 SELECT 절에 사용 된 것과 같은 표현을 다시 인쇄하는 것입니다 :

    당신이 표준이 아닌 경험으로 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
    
  2. ==============================

    2.나는 "MySQL의 구문은 비표준는"내 의견에 유효한 인수하지 않습니다 같은 문제에 고투하고. PostgreSQL은 '재 ... INSERT "삽입 후 자동 ID를 얻기 위해, 예를 들어,뿐만 아니라 편리 비표준 확장을 추가합니다. 또한, 대형 쿼리를 반복하는 것은 우아한 해결책이 아니다.

    나는 "MySQL의 구문은 비표준는"내 의견에 유효한 인수하지 않습니다 같은 문제에 고투하고. PostgreSQL은 '재 ... INSERT "삽입 후 자동 ID를 얻기 위해, 예를 들어,뿐만 아니라 편리 비표준 확장을 추가합니다. 또한, 대형 쿼리를 반복하는 것은 우아한 해결책이 아니다.

    그러나, 나는 WITH 문이 매우 도움이되었다고합니다. 그것은 일종의 그런 다음 일반적인 테이블처럼 사용할 수있는 쿼리 내에서 임시 뷰를 작성합니다. 난 당신이 제대로 가입 다시 한 있는지 확실하지 않습니다 만, 일반적으로는 다음과 같이 작동합니다 :

    WITH jobs_refined AS (
        SELECT
            jobs.*,
            (SELECT 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
    )
    SELECT *
    FROM jobs_refined
    WHERE lead_state = 'NEW'
    
  3. ==============================

    3.당신도 where 절에 case 문을 복제 할 필요가, 또는 내 취향은 다음과 같은 일을하는 것입니다 :

    당신도 where 절에 case 문을 복제 할 필요가, 또는 내 취향은 다음과 같은 일을하는 것입니다 :

    SELECT *
    FROM (
    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
    ) q1
    WHERE (lead_state = 'NEW')
    
  4. ==============================

    4.나는 일반적인 솔루션은 내부 SELECT의 결과가 실행이 해당 쿼리에 도달하는 시간으로 전체 외부 쿼리 사용할 수 있습니다 그래서 (이 경우 또는 CASE 문) 계산을 위해 내부 SELECT를 사용하는 것입니다 생각합니다. 그렇지 않으면, WHERE 절은 먼저 평가하고 SELECT 절에 대해 아무것도 알고있다.

    나는 일반적인 솔루션은 내부 SELECT의 결과가 실행이 해당 쿼리에 도달하는 시간으로 전체 외부 쿼리 사용할 수 있습니다 그래서 (이 경우 또는 CASE 문) 계산을 위해 내부 SELECT를 사용하는 것입니다 생각합니다. 그렇지 않으면, WHERE 절은 먼저 평가하고 SELECT 절에 대해 아무것도 알고있다.

  5. ==============================

    5.어디에서 이런 난에 별칭을 사용했다. (INNER 쿼리).

    어디에서 이런 난에 별칭을 사용했다. (INNER 쿼리).

    Select "Vendors"."VendorId", "Vendors"."Name","Result"."Total" 
    From (Select "Trans"."VendorId", ("Trans"."A"+"Trans"."B"+"Trans"."C")    AS "Total"
            FROM "Trans"
        WHERE "Trans"."Year"=2014                                                
        ) As "Result"
    JOIN "Vendors" ON "Result"."VendorId"="Vendors"."VendorId" 
    WHERE "Vendors"."Class"='I' AND "Result"."Total" > 200
    
  6. ==============================

    6.

    SELECT "tab_1"."BirthDate", "tab_1"."col_1" FROM (
       SELECT BirthDate, DATEADD(year, 18, BirthDate) AS "col_1" FROM Employees
    ) AS "tab_1"
    WHERE "tab_1"."col_1" >= '2000-12-31';
    
  7. from https://stackoverflow.com/questions/3241352/using-an-alias-column-in-the-where-clause-in-postgresql by cc-by-sa and MIT license