해결된 질문
작성
·
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가 더 유용하다입니다.