재사용 가능한 열 별칭 사용

BigQuery의 GoogleSQL은 재사용 가능한 열 별칭을 지원합니다. 재사용 가능한 열 별칭을 사용하면 SQL 쿼리의 SELECT 절에서 표현식의 별칭을 정의하고 동일한 SELECT 목록 또는 동일한 쿼리 블록의 WHERE 절 내에서 해당 별칭을 즉시 참조할 수 있습니다.

예를 들어 다음 쿼리는 gross_price와 같은 계산을 기반으로 결과를 필터링하는 방법을 보여줍니다. WHERE 절에서 계산을 반복하거나 하위 쿼리를 사용하는 대신 WHERE 절에서 별칭 gross_price를 직접 참조할 수 있습니다.

SELECT
  net_price * 1.23 as gross_price
FROM
  product
WHERE
  gross_price < 10.0

재사용 가능한 열 별칭은 다음과 같은 이점을 제공합니다.

  • 간소화된 SQL 문법: 복잡한 표현식을 반복하거나 쿼리를 하위 쿼리로 래핑하지 않고도 깔끔하고 간결한 왼쪽에서 오른쪽으로의 계산을 작성할 수 있습니다.
  • 가독성 향상: 분석가와 개발자는 표현식을 한 번 선언한 후 즉시 재사용할 수 있습니다. 이렇게 하면 쿼리를 더 쉽게 읽고 디버그하고 유지관리할 수 있습니다.

재사용 가능한 열 별칭 사용 설정 또는 사용 중지

기본적으로 재사용 가능한 열 별칭은 사용 중지되어 있습니다. 열 별칭을 사용하려면 BigQuery 관리자가 다음 데이터 정의 언어 (DDL) 문 중 하나를 사용하여 reusable_column_aliases_mode 옵션을 on로 설정하여 기능을 사용 설정해야 합니다.

이 구성 옵션을 설정하려면 프로젝트에 대한 BigQuery 관리자(roles/bigquery.admin) 역할 또는 bigquery.projects.update 권한이나 조직에 대한 bigquery.organizations.update 권한이 필요합니다. 구성 옵션을 설정하는 데 필요한 권한에 대한 자세한 내용은 구성 설정 관리 페이지의 필수 권한을 참조하세요.

재사용 가능한 열 별칭을 사용 중지하려면 reusable_column_aliases_mode를 off로 설정합니다. 값을 NULL로 설정하면 시스템 기본값이 사용되고 기능도 사용 중지됩니다.

예시

조직 수준에서 재사용 가능한 열 별칭을 사용 설정하려면 다음 DDL 문을 입력합니다.

ALTER ORGANIZATION
SET OPTIONS (
  `region-REGION.reusable_column_aliases_mode` = "on"
);

REGION을 현재 리전으로 바꿉니다.

프로젝트 수준에서 재사용 가능한 열 별칭을 사용 설정하려면 다음 DDL 문을 입력합니다.

ALTER PROJECT PROJECT_ID
SET OPTIONS (
  `region-REGION.reusable_column_aliases_mode` = "on"
);

다음을 바꿉니다.

  • REGION: 리전입니다.
  • PROJECT_ID: 프로젝트 ID입니다.

열 별칭이 사용 설정되었는지 또는 사용 중지되었는지 확인

다음 정보 스키마 뷰를 쿼리하여 프로젝트 또는 조직 수준에서 재사용 가능한 열 별칭이 사용 설정되었는지 또는 사용 중지되었는지 확인할 수 있습니다.

정보 스키마 뷰 작업에 대한 자세한 내용은 INFORMATION_SCHEMA 소개를 참조하세요.

재사용 가능한 열 별칭 사용 방법

WHERE 절 또는 SELECT 절에서 표현식에 할당된 식별자인 별칭을 사용할 수 있습니다.

  • WHERE 절: SELECT 목록에 정의된 계산된 열을 기준으로 필터링합니다.
  • SELECT 절: 계산된 별칭을 사용하여 동일한 프로젝션 목록 내에서 다른 별칭을 정의하거나 쿼리에서 반환되는 데이터를 결정합니다.

예

이 예시에서는 재사용 가능한 열 별칭을 사용하여 SELECT 목록에서 이전에 정의한 다른 계산을 기반으로 값을 계산하는 방법을 보여줍니다. 또한 이 쿼리는 WHERE 절에서 별칭을 참조하는 방법을 보여줍니다.

SELECT
  net_price * 1.23 as gross_price,
  gross_price * 0.5 as discounted_gross_price
FROM
  product
WHERE
  discounted_gross_price < 10.0;

쿼리 이름 변환 순서의 동작 변경사항 (시맨틱 드리프트)

식별자 이름은 테이블의 실제 열 및 사용자가 만드는 별칭으로 존재할 수 있으므로 쿼리의 이름 변환 순서를 고려해야 합니다. BigQuery는 다음 순서로 이름을 확인합니다.

  1. 열 이름: 테이블의 기존 열은 항상 우선순위가 가장 높습니다.
  2. 별칭: 쿼리에 정의된 별칭입니다.
  3. 외부 쿼리 열: 상위 쿼리의 열입니다.
  4. 함수 인수: 사용자 정의 함수 (UDF) 또는 테이블 반환 함수 (TVF) 내에서 실행되는 경우
  5. 스크립트 변수: 스크립트에 정의된 변수입니다.

이 순서에 따라 테이블에 gross_price라는 열이 있고 gross_price라는 별칭을 만들면 쿼리는 별칭이 아닌 열 값을 사용합니다.

즉, SELECT 절에서 정의한 별칭과 이름이 같은 외부 쿼리 열, 함수 인수 또는 스크립트 변수가 있는 경우 BigQuery는 변수 또는 인수 대신 계산에 별칭 값을 사용합니다.

이름 변환 순서 작동 방식의 예시

다음 예시에서는 이름 충돌이 있을 때 재사용 가능한 열 별칭에서 이름 변환 순서가 작동하는 방식을 보여줍니다.

외부 쿼리 열과 충돌

재사용 가능한 열 별칭을 사용 설정하지 않으면 SELECT 절에 정의된 별칭이 외부 쿼리의 열과 이름이 같으면 외부 쿼리 열이 사용됩니다. 재사용 가능한 열 별칭을 사용 설정하면 별칭이 쿼리 범위 내에서 외부 쿼리 열을 '섀도잉'합니다.

다음 예시에서 중첩 쿼리는 별칭을 사용하며 외부 쿼리의 열에 액세스할 수 있습니다.

SELECT
  name,
  net_price,
  category_id, -- table product has category_id column
  (SELECT 100 AS category_id -- alias defined with the same name
     FROM category c
     WHERE
       id = category_id  -- Now the alias category_id is used here, not the outer query column
  ) as X
FROM
  product;

재사용 가능한 열 별칭을 사용 설정하지 않으면 서브 쿼리는 외부 쿼리의 product 테이블에서 category_id 열을 사용합니다. 따라서 category_id 값은 행마다 다릅니다. 재사용 가능한 열 별칭을 사용 설정하면 쿼리는 모든 행에 100의 별칭 값을 사용합니다.

함수 인수와 충돌

쿼리가 사용자 정의 함수 (UDF) 내에서 실행되는 경우 해당 쿼리 내에 정의된 별칭이 함수의 인수보다 우선합니다.

다음 예시에서 calculate_metric 함수에는 val라는 입력 인수가 있습니다.

CREATE TEMP FUNCTION calculate_metric(val INT64) AS ((
  SELECT AS STRUCT
    5 AS val,       -- Alias defined as constant 5
    val + 10        -- Reference to 'val'
));

-- Calling the function with argument 100
SELECT calculate_metric(100);

재사용 가능한 열 별칭을 사용 설정하지 않으면 쿼리는 함수에 전달된 인수 값 (100)을 사용하고 결과는 110 (100 + 10)로 계산됩니다. 재사용 가능한 열 별칭을 사용 설정하면 쿼리는 SELECT 목록 (5)에 정의된 별칭을 사용하고 결과는 15 (5 + 10)로 계산됩니다.

스크립트 변수와 충돌

재사용 가능한 열 별칭을 사용 설정하지 않고 SELECT 절에 스크립트 변수와 이름이 같은 별칭이 정의되어 있으면 스크립트 변수가 사용됩니다. 재사용 가능한 열 별칭을 사용 설정하면 별칭이 쿼리 범위 내에서 변수를 가립니다.

다음 예시에서는 기본값이 10.0인 gross_price라는 변수를 선언합니다. 또한 이 쿼리는 열을 계산하고 별칭을 gross_price로 지정합니다.

DECLARE gross_price NUMERIC DEFAULT 10.0;

SELECT
  net_price * 1.23 AS gross_price,
  -- Usage of 'gross_price' here determines the behavior
  gross_price * 0.5 AS discounted_gross_price
FROM
  product;

재사용 가능한 열 별칭을 사용 설정하지 않으면 쿼리는 10.0의 변수 값을 사용합니다. 결과는 모든 행의 상수인 5.0의 discounted_gross_price 값입니다. 결과는 10.0 * 0.5 = 5.0로 계산됩니다.

재사용 가능한 열 별칭을 사용 설정하면 쿼리는 net_price * 1.23의 별칭 값을 사용합니다. 결과는 행마다 다른 discounted_gross_price 값입니다. 결과는 (net_price * 1.23) * 0.5로 계산됩니다.

권장사항

재사용 가능한 열 별칭을 사용할 때는 다음 권장사항을 고려하세요.

  • 재사용 가능한 열 별칭을 사용 설정하기 전에 기존 워크로드에 미치는 영향을 평가하세요.
  • 의도하지 않은 동작이나 자동 동작 변경 (의미론적 드리프트)을 방지하려면 스크립트 변수, 함수 인수 또는 외부 쿼리의 열 이름을 별칭 이름으로 사용하지 마세요.
  • Teradata 또는 Snowflake와 같은 별칭 지정 시맨틱스를 지원하는 소스 언어에서 SQL을 마이그레이션하는 경우 마이그레이션을 시작하기 전에 SQL 변환 안내를 따르세요.

열 별칭 문제 해결

다음 예시에서는 재사용 가능한 열 별칭과 관련된 일반적인 문제를 해결하는 방법을 보여줍니다.

문제: 예상치 못한 쿼리 결과가 표시되거나 별칭이 무시되는 것으로 보입니다.

해결 방법: 이름 변환 순서를 확인합니다. 테이블에 별칭과 동일한 이름의 열이 포함된 경우 열 이름이 별칭보다 우선순위가 높습니다. 이 충돌을 방지하려면 별칭에 고유한 이름을 지정하세요.

오류: Column not found.

해결 방법: 정방향 참조를 사용하고 있지 않은지 확인합니다. 사용하기 전에 정의된 별칭만 참조할 수 있습니다. 이는 왼쪽에서 오른쪽으로 평가됩니다.

오류: Column name is ambiguous.

해결 방법: 별칭 이름이 참조되기 전에 동일한 SELECT 목록에서 두 번 이상 정의되지 않았는지 확인합니다.

제한사항

재사용 가능한 열 별칭에는 다음과 같은 제한사항이 적용됩니다.

  • 쿼리에 그룹화 또는 집계가 포함된 경우 집계되지 않은 표현식 (그룹화 열 또는 그룹화 열의 프로젝션)에 대한 별칭은 WHERE 절에서 또는 집계 함수의 인수로 허용되지 않습니다. 다음 쿼리에서 별칭 b은 그룹화 열인 a를 포함하는 표현식을 잘못 참조합니다.

    SELECT a+1 as b, sum(b) -- sum(b) is invalid.
    FROM t
    WHERE b > 5         -- Referencing b under WHERE clause is not allowed.
    GROUP BY a
    
  • 집계 또는 윈도우 함수를 직접 또는 전이적으로 참조하는 별칭은 WHERE 절에서 또는 다른 집계 함수의 인수로 사용할 수 없습니다. 다음 쿼리에서 별칭 x은 집계 함수를 잘못 참조합니다.

    SELECT sum(a) AS x, sum(x) -- sum(x) is invalid.
    FROM t
    WHERE x > 0          -- Referencing x under WHERE clause is not allowed.
    
  • 다른 윈도우 함수를 직접 또는 전이적으로 참조하는 별칭에 윈도우 함수를 적용하는 것은 허용되지 않습니다. 다음 쿼리에서 별칭 x은 잘못된 윈도우 함수를 참조합니다.

    SELECT count(*) over() AS x, sum(x) over() -- sum(x) over() is invalid.
    FROM t
    
  • 재사용 가능한 열 별칭은 파이프 구문에서 지원되지 않습니다.

  • 재사용 가능한 열 별칭은 Graph Query Language (GQL)에서 지원되지 않습니다.