동일한 SELECT 목록의 참조 열 별명


27

오래된 MS-Access 기반 시스템을 PostgreSQL로 변환하고 있습니다. Access에서 SELECT로 구성된 필드는 다음과 같이 이후 필드에 대한 방정식의 일부로 사용될 수 있습니다.

SELECT
    samples.id,
    samples.wet_weight / samples.dry_weight - 1 AS percent_water,
    100 * percent_water AS percent_water_100
FROM samples;

PostgreSQL 에서이 작업을 수행하면 Postgres에서 오류가 발생합니다.

오류 : "percent_water"열이 없습니다.

하위 선택에서 선택하여이 문제를 해결하는 방법은 다음과 같습니다.

SELECT
    s1.id,
    s1.percent_water,
    100 * s1.percent_water AS percent_water_100
FROM (
    SELECT
        samples.id,
        samples.wet_weight / samples.dry_weight - 1 AS percent_water
    FROM samples
    ) s1;

복잡한 중첩을 피하기 위해 첫 번째 코드 블록과 같은 바로 가기가 있습니까? 나는 또한 말할 수는 100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100있지만, 이것은 내 코드에서 진행되는 훨씬 더 큰 수학 시스템에 대한 작은 예일뿐입니다. 수십 개의 복잡한 수학 비트가 서로 쌓여 있습니다. 나는 반복하지 않고 가능한 한 깨끗하게하는 것을 선호한다.

답변:


24

때로는 불편하지만 SQL 표준 동작이며 모호성을 방지합니다. 동일한 SELECT목록 에서 열 별명을 참조 할 수 없습니다 .

더 짧은 구문 옵션이 있습니다.

SELECT s.*, s.percent_water * 100 AS percent_water_100
FROM  (
   SELECT id, wet_weight / NULLIF(dry_weight - 1, 0) AS percent_water
   FROM   samples
   ) s;

그리고 LATERALPostgres 9.3+에서 조인을 사용할 수 있습니다 .

SELECT s.id, s1.percent_water
     , s1.percent_water * 100 AS percent_water_100
FROM   samples s
     , LATERAL (SELECT s.wet_weight / NULLIF(s.dry_weight - 1, 0) AS percent_water) s1;

NULLIF()0으로 나누기 오류를 방지하기 위해 추가 했습니다.


2
안녕. SQL standart가 방지하는 모호한 예를 통해 답을 확장 할 수 있습니까?
Eugen Konkov

4

500 줄 이상의 Netezza 쿼리 (일명 수정 된 Postgres)를 SQL Server로 마이그레이션하는 것과 같은 결과가 나왔습니다. Netezza에서 계산 열 별명은 다운 스트림 참조에서 값으로 사용될 수있었습니다.

내 해결 방법은 CROSS APPLY를 상관 하위 쿼리와 함께 사용하는 것이 었습니다. 원래 쿼리에서 열 별칭에 대한 수많은 참조를 전혀 변경할 필요가 없다는 것이 장점입니다.

OP의 쿼리를 사용하면 CROSS APPLY방법은 다음과 같습니다.

SELECT
    s.id,
    x.percent_water,
    100 * x.percent_water AS percent_water_100
FROM samples AS s
CROSS APPLY (SELECT s.wet_weight / s.dry_weight - 1 AS percent_water ) x ;

1
CROSS APPLY(및 OUTER APPLY)는 SQL Server의 LATERAL하위 쿼리 작성 방법입니다 .
ypercubeᵀᴹ

4
cross applyPostgres 에는 없습니다 . Postgres는 표준을 준수하고를 사용합니다 cross join lateral.
a_horse_with_no_name 22시 25 분
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.