PostgreSQL의 PL/pgSQL 튜토리얼 – 4 : IF 조건문

안녕하세요, GIS Developer 김형준입니다. 이번 장에서는 PL/pgSQL에서 제공하는 조건문에 대해 살펴보겠습니다. 조건문은 어떤 조건에 대해 실행할 코드를 분리하기 위한 목적으로 사용됩니다.

PL/pgSQL에서 제공하는 조건문은 IF 문과 CASE 문으로 크게 구분할 수 있습니다. 먼저 IF 문에 대해 살펴보겠습니다.

IF 문의 문법은 아래와 같습니다.

IF <조건> THEN
    <참의 실행 코드>
ELSE
    <거짓의 실행 코드>
END IF;

만약 <조건>이 부합되는 거짓(false)이 아닌 참(true)일 경우 <참의 실행 코드>를 실행하고, <조건>이 거짓일 경우 <거짓의 실행 코드>를 실행합니다. 조건에 대한 실행 코드는 1줄 이상으로 구성할 수 있습니다.

일단 간단한 코드를 통해 ELSE 구문이 없는 IF문의 예를 살펴보겠습니다.

DO $$
DECLARE
    a integer := 20;
    b integer := 40;
    c integer := 20;
BEGIN 
    IF a > b THEN
        RAISE NOTICE 'a가 b보다 더 큽니다다.';
    END IF;
 
    IF a < b THEN
        RAISE NOTICE 'a가 b보다 더 작습니다.';
    END IF;
 
    IF a = b THEN
        RAISE NOTICE 'a와 b가 동일합니다.';
    END IF;
    
    IF a >= c THEN
        RAISE NOTICE 'a가 c보다 크거나 같습니다.';
    END IF;
    
    IF a != b THEN
        RAISE NOTICE 'a가 b가 같지 않습니다.';
    END IF;
    
    IF a != b AND a = c THEN
        RAISE NOTICE 'a와 b가 같지 않고 a와 c가 같습니다.';
    END IF;
    
    IF a = b OR a = c THEN
        RAISE NOTICE 'a와 b가 같거나 a와 c가 같습니다.';
    END IF;
    
    IF NOT (a = b OR a = c) THEN
        RAISE NOTICE 'a와 b가 같지지 않고 a와 c도 같지 않습니다.';
    END IF;
END $$;

변수 a, b, c를 각각 20, 40, 20으로 초기화하고, 각 값에 대해 IF 문을 통해 비교하고 있습니다. 먼저 7번 IF 문은 a가 b 보다 크다라는 조건에 부합하지 않으므로 8번 코드를 실행하지 않습니다. 비교 연산은 크다, 작다, 같거나 크다, 같거나 작다, 같지 않다, 같다에 대해 각각 >, <, >=, <=, !=, =입니다. 조건에 대해 AND와 OR 그리고 NOT으로 묶어 조합할 수 있습니다. 27번의 IF 문은 a와 b가 같지 않고(AND) a와 c가 같은가라는 조건으로 참이므로 28번 코드가 실행됩니다. 30번의 IF문은 a와 b가 같거나(OR) a와 c가 같은가라는 조건으로 거짓이므로 31번은 실행되지 않습니다. 그리고 33번의 IF 문은 a와 b가 같거나 a와 c가 같은가에 대한 조건을 NOT으로 부정하고 있는데, a와 b가 같거나 a와 c가 같은가는 참(true)이고 이를 부정하므로 결국 거짓(false)되어 34번 코드는 실행되지 않습니다. 최종 결과는 아래의 화면과 같습니다.

ELSE 구문까지 포함한 IF 문의 예를 보면 아래와 같습니다.

DO $$
DECLARE
    a integer := 20;
    b integer := 40;
BEGIN 
    IF a > b THEN
        RAISE NOTICE 'a가 b보다 더 큽니다.';
    ELSE
        RAISE NOTICE 'a가 b보다 더 크지 않습니다.';
    END IF;
END $$;

IF 문에서 a가 b보다 큰가에 대한 조건이 거짓(false)이므로 ELSE 문 다음의 실행 코드가 실행되므로 그 결과는 다음과 같습니다.

IF 문에 대한 마지막 예로 다음 코드를 살펴보겠습니다.

DO $$
DECLARE
    a integer := 20;
    b integer := 40;
BEGIN 
    IF a > b THEN
        RAISE NOTICE 'a가 b보다 더 큽니다.';
    ELSEIF a = b THEN
        RAISE NOTICE 'a와 b가 같습니다.';
    ELSE
        RAISE NOTICE 'a와 b가 같지 않고, a가 b보다 더 크지도 않습니다.';
    END IF;
END $$;

ELSEIF 문을 사용하고 있는데요. 만약 첫번째 IF 문에 대한 조건이 거짓이면 다음의 ELSEIF 문의 조건을 검사하게 됩니다. 그런데 이 ELSEIF 문 역시 거짓이라면 다음 ELSEIF 문을 검사하게되고, 최종적으로 어떠한 조건도 만족하지 않는다면 ELSE 문의 코드가 실행되게 됩니다. 위의 코드의 실행 결과는 아래와 같습니다.

“PostgreSQL의 PL/pgSQL 튜토리얼 – 4 : IF 조건문”에 대한 3개의 댓글

  1. 안녕하세요. 혹시 postgresql의 pgadmin이 4로 변경 되면서 IF문의 변경이 있었는지요???
    저는 현재 pgadmin3을 사용하고있습니다. (postgresql 9.5)

    ELSEIF 문으 쓰려고하니 에러가나서 찾아보니깐 ELSIF 를 써야 하더군요…
    캡처해주신 화면에 보니깐 문장에러는 안났는데
    궁금해서 여쭙니다…

    1. 안녕하세요, 김형준입니다.
      아마도 postgresql 최신버전에서는 ELSIF와 ELSEIF 모두를 지원하고..
      구버전에서는 ELSIF 만을 지원하는 듯합니다.
      제가 테스트한 버전은 postgresql 9.5 였던 것으로 기억합니다.

  2. ‘ 조건에 대한 실행 코드는 1줄 이상으로 구성할 수 있습니다.’

    이것에 대해 궁금합니다

    제가 원하는 것은
    IF 조건 THEN
    UPDATE~~~~
    INSERT ~~~~~
    ELSE
    INSERT~~~~
    ENDIF;

    처럼 THEN 뒤에 각각의.기능을 하는 두가지 명령을 하고 싶습니다.

    이것이 가능할까요?
    가능하다면 어떤 방식으로 2개의 명령어를 나열해 주어야 할까요?

    가르쳐주세요
    감사합니다

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다