인프런 커뮤니티 질문&답변

jenna님의 프로필 이미지
jenna

작성한 질문수

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

4-3. BigQuery의 절차적 언어(Precodural Language) : DECLARE, SET, EXECUTE, IMMEDIATE

4-3 EXECUTE IMMEDIATE 쿼리

해결된 질문

작성

·

30

0

  • 변수 선언해서 사용할때와 EXECUTE IMMEDIATE 사용할 때의 차이점은 무엇인가요?

DECLARE custom_event STRING DEFAULT 'screen_view';
SELECT 
 COUNT(*) AS output
FROM advanced.app_logs
WHERE 
 event_date = '2022-08-01'
 AND
 event_name = custom_event
GROUP BY ALL 

답변 1

0

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

안녕하세요. EXECUTE IMMEDIATE에도 DECLARE를 사용해서 주입합니다

 

말씀하신 케이스는 다음과 같네요

  • (1) DECLARE를 사용한 후, 쿼리에서 변수를 바로 사용한 경우

  • (2) DECLARE를 사용한 후, EXECUTE IMMEDIATE를 사용한 경우

     

     

  • (1) DECLARE를 사용한 후, 쿼리에서 변수를 바로 사용한 경우

    • 변수를 선언하고 쿼리에서 참조

    • 쿼리 실행 시점에 값이 고정됩니다

       

  • (2) DECLARE를 사용한 후, EXECUTE IMMEDIATE를 사용한 경우

    • 쿼리가 실행될 때 변수가 주입

      • 쿼리 구조가 달라질 수 있을 때 유용합니다. 필요한 컬럼이 매번 달라지는 경우

    • 테이블 이름이나 컬럼 이름 등 SQL 구문 자체를 동적으로 변경할 때 사용합니다

    • 강의의 예시는 간단해서 두개가 유사하게 보일 수 있는데, 동적으로 컬럼을 조합해야 할 때 유용합니다

    • 아래 글에 예시를 작성해두었어요(다만 쿼리가 좀 어려운 것처럼 느껴질 수 있어요)

  DECLARE station_ids STRING;
  SET station_ids = (
      SELECT
        CONCAT('("', STRING_AGG(SAFE_CAST(start_station_id AS STRING), '", "'), '")')
      FROM (
        SELECT 
      DISTINCT start_station_id
        FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
        WHERE start_station_id IS NOT NULL 
        ORDER BY start_station_id
      )
  );
  EXECUTE IMMEDIATE format("""
  WITH BASE AS (
  SELECT 
    DATE(start_time) AS start_date,
    start_station_id,
    trip_id
  FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
  WHERE 
    DATE(start_time) BETWEEN "2015-10-01" AND "2015-10-07"
    AND start_station_id IS NOT NULL
  )
  SELECT * 
  FROM base #1 from 절
  PIVOT
  (
    -- #2 집계 함수
    COUNT(trip_id) AS trip_cnt
    -- #3 피벗할 컬럼
    FOR SAFE_CAST(start_station_id AS STRING) in %s
  )
  ORDER BY start_date
  """, station_ids);

 

  • station_ids를 %s에 주입하고, station_ids는 ("1001", "1002", ...) 여러 값이 들어갈 수 있고, 시간이 지나면서 달라질 수 있을거에요. SET station_ids를 할 때 SELECT로 가지고 오거든요.

 

정리하면

  • 하나 정의해서 쓰는 것은 둘 다 비슷

  • SELECT 문으로 결과를 가지고 와서 쿼리문에 주입할 때 EXECUTE IMMEDIATE를 사용. 좀 더 유연하고 동적으로 변할 수 있는 경우 유용

    • 다만 이 부분은 어렵게 느껴질 수 있는데, 난이도로 분류하면 제일 어려운 난이도에 들어가는 쿼리문입니다. 쿼리를 천천히 보셔요.

    • 핵심은 동적으로 사용할 때 EXECUTE IMMEIDATE가 더 유용하다입니다.

jenna님의 프로필 이미지
jenna

작성한 질문수

질문하기