PLSQL 조건문
✒️ 2025-05-28 16:21 내용 수정
IF문
- Java의 If문처럼 특정 조건에 맞을 때 원하는 내용을 실행하도록 할 수 있다.
- 조건문#1. if 참고.
- THEN 이후 실행문에 반드시 세미콜론 "
;"를 넣어야 하며, IF문이 완료되면 반드시END IF;로 종결 표시를 해야 한다.
-- 조건이 1개인 IF문
IF 조건 THEN 실행문; -- 조건이 참일 때 실행
END IF;
-- IF-ELSE 구조
IF 조건 THEN 실행문; -- 조건이 참일 때 실행
ELSE 실행문; -- 조건이 거짓일 때 실행
END IF;
-- IF-ELSIF-ELSE 구조
IF 조건1 THEN 실행문1; -- 조건1이 참일 때 실행
ELSIF 조건2 THEN 실행문2; -- 조건2가 참일 때 실행
ELSE 실행문; -- 두 조건 모두 거짓일 때 실행
END IF;
IF문 예시
DBMS_OUTPUT.PUT_LINE(내용);을 쓰면 Eclipse의 Console처럼 Output에 출력할 수 있다.- 출력 내용은 누적되어 작성된다.
DECLARE
NUM1 NUMBER := 10;
NUM2 NUMBER := 3*5;
BEGIN
IF NUM1 > NUM2 THEN
DBMS_OUTPUT.PUT_LINE(NUM1||'은 '||NUM2||'보다 크다.');
ELSE
DBMS_OUTPUT.PUT_LINE(NUM1||'은 '||NUM2||'보다 작거나 같다.');
END IF;
END;
- SQL 작성 결과는 두 번째 줄이다.
DECLARE
NUM1 NUMBER := 45;
NUM2 NUMBER := 7;
BEGIN
IF MOD(45, 7) = 0 THEN
DBMS_OUTPUT.PUT_LINE(NUM1||'은 '||NUM2||'의 배수다.');
ELSE
DBMS_OUTPUT.PUT_LINE(NUM1||'은 '||NUM2||'의 배수가 아니다.');
END IF;
END;
- SQL 작성 결과는 세 번째 줄이다.
DECLARE
NUM1 NUMBER := 3;
NUM2 NUMBER := 8;
BEGIN
IF SIGN(NUM1-NUM2) = -1 THEN
DBMS_OUTPUT.PUT_LINE(NUM1||'은 '||NUM2||'보다 작다.');
ELSIF SIGN(NUM1-NUM2) = 0 THEN
DBMS_OUTPUT.PUT_LINE(NUM1||'은 '||NUM2||'과 같다.');
ELSE
DBMS_OUTPUT.PUT_LINE(NUM1||'은 '||NUM2||'보다 크다.');
END IF;
END;
CASE문
- Java의 Switch, 삼항 연산자와 비슷하게 특정 조건에 맞을 때 원하는 값을 출력하도록 설정할 수 있다.
- 조건문#2. switch 참고.
- 데이터의 값을 WHEN 조건과 차례로 비교하여 일치하는 값을 THEN 이후의 형태로 리턴하고, WHEN 조건과 일치하지 않으면 ELSE 이후의 형태로 리턴한다.
- ELSE는 생략 가능하며, ELSE가 생략되어 있고 WHEN 조건에도 맞지 않는 데이터가 있을 때 CASE문은 NULL을 반환한다.
- CASE문이 끝나면 반드시 END를 작성해서 CASE문이 끝났음을 표시해야 한다.
- 만약 WHEN 뒤의 조건 중 참인 것이 두 개 이상이라면 먼저 만나는 조건을 선택하여 판별한다.
- CASE 문 전체는 하나의 값으로 인식되어 값이 올 수 있는 모든 위치에 올 수 있으며, SELECT나 WHERE 절 조건문에도 사용할 수 있다.
-- WHEN 조건이 1개일 때
SELECT 컬럼명,
CASE WHEN 조건1 THEN 참1
ELSE 거짓1
END
FROM 테이블명;
-- WHEN 조건이 여러 개일 때
SELECT 컬럼명,
CASE WHEN 조건1 THEN 참1
WHEN 조건2 THEN 참2
ELSE 거짓2
END
FROM 테이블명;
CASE문 예시
-
HR의 EMPLOYEES 테이블을 사용했다.
-
조건이 1가지 일 때의 CASE문
-- EMPLOYEES 테이블에서 급여가 10000을 초과하면 OVER,
-- 10000 이하면 UNDER로 표시하기
SELECT FIRST_NAME, SALARY,
CASE WHEN SALARY > 10000 THEN 'OVER'
ELSE 'UNDER'
END AS COMP
FROM EMPLOYEES;
CASE 컬럼명 WHEN 조건 THEN 실행문형태로 작성하기
-- EMPLOYEES 테이블에서 직업이 'IT_PROG'인 사원들의
-- 급여 평균을 반올림하여 구하기
SELECT ROUND(AVG(CASE JOB_ID WHEN 'IT_PROG' THEN SALARY END)) AS AVG_SALARY
FROM EMPLOYEES;
- 조건이 여러 개일 때의 CASE문
-- EMPLOYEES 테이블에서 직업 이름에 CLERK를 포함하면 CLERK를,
-- MAN을 포함하면 MAN을, REP을 포함하면 REP을,
-- 셋 중 어느것도 포함하지 않으면 OTHER를 출력하기
SELECT FIRST_NAME,
CASE WHEN JOB_ID LIKE '%CLERK%' THEN 'CLERK'
WHEN JOB_ID LIKE '%MAN%' THEN 'MAN'
WHEN JOB_ID LIKE '%REP%' THEN 'REP'
ELSE 'OTHER'
END AS JOB
FROM EMPLOYEES;
- CASE문의 조건을 여러 개로, 범위 형태로 작성하기
-- EMPLOYEES 테이블에서 입사일이 2005년 1월 1일 이후면 AFTER 2005.01.01를,
-- 입사일이 2003-01-01 과 2005-01-01 사이라면 2003~2005를,
-- 입사일이 2003년 1월 1일 이전이라면 BEFORE 2003.01.01를 출력하기
SELECT FIRST_NAME, HIRE_DATE,
CASE WHEN HIRE_DATE > TO_DATE('2005-01-01', 'YYYY-MM-DD') THEN 'AFTER 2005.01.01'
WHEN HIRE_DATE BETWEEN TO_DATE('2003-01-01', 'YYYY-MM-DD') AND TO_DATE('2005-01-01', 'YYYY-MM-DD')
THEN '2003~2005'
ELSE 'BEFORE 2003.01.01'
END AS HIRED_YEAR
FROM EMPLOYEES;