본문 바로가기

SQL - Mysql & Oracle/SQL 실무에 적용하기

[Bigquery] SQL로 Loop과 While 반복문 제어하기(feat. 절차적 코드)

반응형

빅쿼리 환경에서는 절차적 코드 기법으로 데이터를 전처리할 수 있다. 그 중에서 대표적인 방법인 Loop와 While을 통해 코드를 구성하여 작업 시간을 단축시켜줄 기법을 소개하고자 한다. 

 

목차

1. 빅쿼리의 절차적 코드와 반복문 기본 소개

2. Loop 문을 통한 반복문 제어

3. While 문을 통한 반복문 제어

1. 빅쿼리의 절차적 코드와 반복문 기본 소개

 

빅쿼리에서는 사용하는 리소스만큼 과금이 되는 형식이기 때문에 코드 효율성에 따라 운영 비용도 달라진다. 실제로 GCP 정책상 사용되는 리소스 1TB당 약 $5의 과금을 실시하고 있는데, CRUD 과정에서 1TB는 아주 쉽게 쓰일 수 있기 때문에 효율적인 데이터 파이프라인 관리 및 SQL문 작성은 필수적이다. 이를 위한 솔루션이 바로 절차적 언어이다. (구글 공식 가이드 주소)

 

오늘 배워볼 반복문은 바로 Loop 문과 While 문이다. 반복문에서는 가장 중요하게 기억해야 할 것이 3가지가 있다. 첫 번째는 수행되는 기본 문법이고, 두 번째는 반복문이 끝나는 조건을 설정해야 하는 것이고, 마지막으로는 반복문 수행 시 예상치 못 한 에러가 발생했을 때 무한으로 돌지 않게 탈출하는 코드를 삽입해주는 것이다. 오늘 코드는 이 관점들에 집중하여 실무에 바로 적용할 수 있도록 설명해보겠다. 

 

 

 

 

 

2. Loop 문을 통한 반복문 제어

 

(1) Loop 문의 기본 문법

1
2
3
4
5
6
 
LOOP
 
{{ 원하는 SQL문을 넣어주세요}}
 
END LOOP;
cs

 

기본적인 문법은 굉장히 단순한 편이다. 빅쿼리에서는 항상 시작과 끝을 알리는 명령어가 존재하고, 항상 하나의 Logic이 끝날 때마다 ; 을 붙여주는 것을 잊지 않는 것이 핵심이다. 하지만 위에서 언급한 무한 루프에 빠지지 않도록 탈출하는 코드를 반드시 구성해야 하는데 이 부분이 빠졌다. 그래서 항상 Loop문은 방어 코드를 위해서 IF 논리와 같이 쓰는 연습을 해야 한다.  

 

 

 

(2) 기초 예시를 통한 문법 마스터

  • 첫 번째 예시 - 1부터 10까지 순차적으로 선택해보기
    • 코드 주석 설명
    • step1. 반복문의 상태를 항상 check할 수 있도록 변수를 설정해주었다.
    • step2. Loop가 시작되었음을 선언해주도록 한다.
    • step3. Break 함수를 통해 반복문이 강제 종료되는 시점을 정의한다. 
      • 반복문을 탈출할 때 쓰는 명령문은 BREAK와 LEAVE가 있으니 반드시 기억하자.
    • step4. 1번의 루프가 끝나면, 상태를 확인할 수 있도록 변수를 업데이트한다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## Step1. 변수의 선언
## Default값을 설정하는 것을 권장
declare x int64 default 0;
 
## step2.조건문의 시작
loop 

## step3. 반복문의 강제 탈출 조건
  if x >= 10 
    then break; -- 10 이상이 되면 Loop에서 탈출하는 방어 코드
    else 
      select x;
      
     ## Step4.루프가 마무리 되면, 변수를 업데이트를 해줘야 무한 Loop에 빠지지 않는다.
      set x = x + 1;
  end if;
 
## 조건문의 종료
end loop;
 
cs

 

 

위의 코드를 실행하면 왼쪽의 사진과 같이 총 10번의 SQL이 발생하고, 그 상세 결과값은 오른쪽 사진과 같이 점차적으로 1씩 더해지면서 증가하는 모습을 볼 수 있다.

SQL LOOP 예시 화면
빅쿼리 LOOP의 상세 화면 예시

 

 

 

 

3. While 문을 통한 반복문 제어

 

(1) While 문의 기본 문법

1
2
3
WHILE {{반복 시작 조건}} DO
  {{원하는 SQL문을 작성해주세요}};
END WHILE;
cs

While 문의 장점은 바로 반복문과 조건문을 하나의 문법 안에서 해결할 수 있다는 것이다. 한 번의 Iteration이 끝났을 때, "반복 시작 조건"을 확인하고, 그 값이 True일 때만 다음 Iteration을 수행하게 된다. 따라서 위에 있는 Loop보다 어떻게 보면 더욱 편리할 수도 있다. 하지만 혹시 모르니 여기서도 강제로 탈출할 수 있는 방어 코드는 짜놓는 것이 좋다. 

 

 

 

(2) 예시를 통한 문법 마스터

  • 두 번째 예시 - 2의 배수를 선택해보자
    • Step1. 여기에서 필요한 변수는 2개로 설정하였다. 2의 배수의 선택되는 과정을 관찰하기 위해서 array type의 자료 구조를 만들었다.
    • Step2. 여기서 boolean 조건에 해당하는 것이 바로 X값이 10보다 작은지 큰지 비교하는 것이다. 한 줄로 IF 논리를 대체하였으니 코드가 굉장히 깔끔해졌다.
    • Step3. 이제 array를 불러와서 결과가 어떻게 나오는지 확인해볼 차례이다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
-- step1. 필요한 변수의 선언
declare x int64 default 1;
declare y array<int64>;
 
-- 초기 변수 설정
set y = [];
 
-- step2. 반복문의 실행
while x <= 10 do
  set y = array_concat(y , [( x ) * 2 ] );
  set x = x + 1;
end while;
 
-- step3.최종 결과 조회
select y
 
 
 
 
cs

 

 

bigquery while 예제 결과

 

 

 

 

반응형