본문 바로가기

SQL/DB2

DB2 흐름 제어 : 비교 제어 IF , CASE 문

1. 흐름 제어 문장 

 

SQL PL 에서는 프로그램과 유사한 방식을 통하여 실행 순서를 제어할 수 있다.

크게 비교 제어(IF, CASE), 반복 제어(LOOP, WHILE, REPEAT, FOR), 이동 제어(ITERATE, LEAVE, GOTO, RETURN) 세 가지로 분류할 수 있다.

구분 SQL PL 문장 compiled 복합 SQL  inlined 복합 SQL 데이터 액세스 레벨
비교 제어 IF O O CONTAINS SQL
CASE O X CONTAINS SQL
반복 제어 LOOP O X CONTAINS SQL
WHILE O O CONTAINS SQL
REPEAT O X CONTAINS SQL
FOR O O READS SQL DATA
이동 제어 ITERATE O O CONTAINS SQL
LEAVE O O CONTAINS SQL
GOTO O X CONTAINS SQL
RETURN O O CONTAINS SQL

 

 

2. 비교 제어 : IF 문

 

IF 문은 한 개 이상의 조건과 조건별 처리할 SQL 문을 지정하고, 만족하는 조건에 대한 처리만을 선택적인 실행이 가능한 다중 조건 분기분이다.

코드 작성 순서대로 조건을 평가하고, 평가 결과가 TRUE 가 되는 조건의 내용을 처리하고 IF 문을 종료하게 된다.

모든 조건문을 만족하지 않은 경우에 대해서는 ELSE 문을 통하여 기본 처리 내용을 지정할 수 있다.

IF 조건1 THEN
    SQL PL;
ELSEIF 조건2 THEN
    SQL PL;
ELSEIF 조건N THEN
    SQL PL;
ELSE 
    SQL PL;
END IF

IF 문을 작성할 때에는 반드시 시작을 알리는 IF 문끝을 알리는 END IF 를 지정해줘야 한다.

또한 각 조건문에 대응하는 THEN 을 작성해야 한다.

분기되는 조건문이 여러 개인 경우에는 ELSEIF 문을 통하여 추가 가능하고, 분기 조건이 하나인 경우에는 생략이 가능하다. 

ELSE 문의 경우에는 모든 조건을 충족시키지 않았을 경우에 대한 기본 처리를 하고 싶다면 선택적으로 작성이 가능하다.

 

조건문에는 SELECT 문의 WHERE 절에서 레코드 검색 조건을 지정할 때와 동일한 형식으로 사용할 수 있다.

 

조건이 한 개만 있는 경우에는 다음과 같이 작성할 수 있다.

DECLARE V1 INT DEFAULT 10;

IF V1 >100 THEN
SET V1 = V1 * 2;
END IF;

위의 예문에서 V1 은 기본값이 10 이기 때문에 조건을 충족하지 못하기 때문에 SET 문이 실행되지 않는다.

 

다음은 N 개의 분기 조건을 추가하는 경우를 살펴보자.

DECLARE V1 INT DEFAULT 150;

IF V1 < 10 THEN
SET V1 = V1 * 10;
ELSEIF V1 < 100THEN
SET V1 = V1 * 50;
ELSEIF V1 < 200 THEN
SET V1 = V1 * 100
END IF;

위의 예문의 V1 은 기본값이 150이기 때문에 세번째 조건을 충족하게 된다. 

 

조건문의 내용을 부정하고 싶다면 NOT 키워드를 사용하면 된다.

IF NOT(V1 <10) THEN

또는 비교 연산자를 변경하는 방법도 있다.

IF V1 >= 10 THEN

 

 

2-1. IF 문 조건문에서 변수 확인하기

 

1️⃣ NULL 확인

 

조건식에 사용되는 변수가 NULL 인지 확인하기 위해서는 IS NULL 연산자를 활용할 수 있다.

DECLARE V1 INT DEFAULT NULL;

IF V1 IS NULL THEN
SET V1 = 0;

V1 은 기본값이 NULL 이기 때문에 조건문에서 IS NULL 연산자에 의하여 TRUE 로 평가된다.

IS NULL 연산자뿐만 아니라 V1 = NULL 로도 평가 가능하다.

 

이와 반대를 확인하기 위해서는 IS NOT  NULL 또는 != NULL 을 활용할 수 있다.

 

2️⃣ boolean 변수 비교하기

 

boolean 변수의 값은 true, false, null 중에 한 가지로, 대소문자 구분을 하지 않는다.

= 연산자를 통하여 확인하거나, 다른 boolean 변수와 비교하는 방식으로 확인 가능하다.

DECLARE V1 BOOLEAN DEFAULT TRUE;
DECLARE V2 INT DEFAULT 10;

IF(V1 = TRUE) THEN
SET V2 = 20;
END IF;

 

3️⃣ row 변수 비교하기

 

두 개의 row 변수를 비교하기 위해서는 직접적인 비교로는 판단할 수 없고 각 개별 필드를 모두 비교해야 한다.

동일한 유형이라고 하더라도 단순한 비교로는 오류가 발생할 수 있음을 기억하자.

DECLARE V1, V2 ANCHOR ROW OF TABLE_X;

SET V1 = ('A', 10);
SET V2 = V1;

IF (V1.XNO = V2.XNO AND V1.XNAME = V2.XNAME) THEN
SQL PL;
END IF;

IF (V1 = V2) THEN ---- 오류발생

마찬가지로 row 변수를 NULL 값인지 확인하기 위해서도 개별 필드를 모두 비교해야 한다.

 

 

2-2. 두 개 이상의 조건 연결하기

 

조건문에서 AND 또는 OR 을 이용하여 두 개 이상의 조건문을 하나의 절에서 표현이 가능해진다.

조건식 1 AND 조건식 2
조건식 1 OR 조건식 2

AND 연산자를 사용하는 경우에는 조건식 1과 2 모두 참으로 평가되어야 THEN 절이 실행되고,

OR 연산자를 사용하는 경우에는 조건식 1 또는 2 중 하나만 참으로 평가되어도 THEN 절이 실행된다.

 

이러한 특징을 활용하여 AND 연산자는 조건식 1에서 FALSE 로 평가되면 뒤의 조건식을 평가하지 않고 바로 다음 조건으로 넘어간다.

OR 연산자는 조건식 1에서 TRUE 로 평가되면 뒤의 조건식을 평가하지 않고 THEN 절을 실행하게 된다.

 

 

3. 비교 제어 : CASE 문

 

CASE 문은 IF 문과 동일한 다중 조건 분기문이다.

조건에 대해 작성된 순서대로 평가하고, 참인 조건이 있을 경우 해당되는 내용을 처리하고 종료한다.

만약 참인 조건이 없는 경우에는 ELSE 문을 통한 기본 처리 내용이 실행된다.

CASE
WHEN 조건1 THEN
SQL PL;
WHEN 조건2 THEN
SQL PL;
ELSE 
SQL PL;
END CASE;

CASE 문은 IF 문과 동일하게 조건문을 작성 가능하고, 값만을 지정할 수도 있다.

CASE 필드
WHEN 값1 THEN
SQL PL;
WHEN 값2 THEN
SQL PL;
ELSE 
SQL PL;
END CASE;

이러한 형태는 필드 = 값 이라는 조건문과 동일하게 작동한다.

 

 

 

3-1. CASE 문과 CASE  수식의 차이점

 

SQL PL 의 CASE 문과 SQL 의 CASE 수식은 형식적으로 유사한 형태를 사용하지만 기능적인 측면에서 차이가 있다.

CASE 문은 다중 조건 분기문으로 작성된 조건문에 따라 여러 개의 SQL 또는 SQL PL 문을 실행하게 된다.

하지만 CASE 수식은 SQL 또는 SQL PL 문이 아닌 한 개의 값만을 반환하게 된다.

'SQL > DB2' 카테고리의 다른 글

DB2 흐름 제어 : 이동 제어 ITERATE, GOTO, RETURN  (0) 2022.12.19
DB2 흐름 제어 : 반복 제어 LOOP, REPEAT, WHILE, FOR  (0) 2022.12.19
DB2 VALUES INTO 문  (0) 2022.12.19
DB2 SELECT INTO 문  (0) 2022.12.08
DB2 DECLARE TYPE, DECLARE, SET  (0) 2022.12.07