[Oracle] 오라클 WHERE 절에 if 문 사용법 (CASE WHEN)
- 데이터베이스/오라클
- 2023. 12. 6.
오라클의 WHERE 절에 if 문을 사용하기 위해서는 동적 쿼리문을 사용하거나 Procedure를 만들면 내부에서 if 문을 사용할 수 있다. 순수 SQL 문에서는 if 문을 사용할 수 없으나, WHERE 절에 CASE WHEN, OR, UNION ALL을 사용하면 if 문과 유사한 효과를 낼 수 있다. 아래는 자주 사용하는 if 문과 유사한 효과를 낼 수 있는 3가지 방법이다.
목차 |
※ 아래는 SQL Developer 쿼리툴을 사용하여 실행한 결과이다. 쿼리툴의 종류에 따라서 define 입력 변수를 사용하는 방법이 조금씩 다를 수 있으니 이점을 유의하여 참고하면 된다. |
OR 연산자를 사용하여 if 문 효과 내기
define in_column = 'MGR'; --'MGR' or 'EMPNO'
define in_empno = 7698;
SELECT *
FROM emp
WHERE deptno = 30
AND (
('&in_column' = 'MGR' AND mgr = '&in_empno')
OR ('&in_column' = 'EMPNO' AND empno = '&in_empno')
)
OR 연산자를 사용하여 mgr 칼럼으로 조회할지 empno 칼럼으로 조회할지 조건을 부여할 수 있다.
"EMPNO" 칼럼을 조건으로 부여하면 empno에 해당하는 데이터만 조회된다.
mgr, empno 칼럼이 인덱스를 태워야 하는 칼럼이라면 OR 연산자 사용 시 인덱스를 타지 못하기 때문에 속도가 느리다. 이럴 때는 아래의 UNION ALL을 사용할 것을 권장한다.
CASE WHEN을 사용하여 if 문 효과 내기
define in_column = 'MGR'; --'MGR' or 'EMPNO'
define in_empno = 7698;
SELECT *
FROM emp
WHERE deptno = 30
AND CASE WHEN '&in_column' = 'MGR' THEN mgr
WHEN '&in_column' = 'EMPNO' THEN empno
END = '&in_empno'
CASE 연산자를 사용하면 OR 연산자를 사용할 때와 동일하게 조건을 부여할 수 있다. OR 연산자를 사용할 때보다 조금 더 간결하게 쿼리문을 작성할 수 있다.
CASE 연산자 외에도 DECODE 함수, NVL 함수를 사용할 수 있다.
조건 칼럼에 CASE 연산자를 사용하면 인덱스를 타지 못하기 때문에 인덱스 칼럼인 경우에는 주의해서 사용해야 한다.
UNION ALL을 사용하여 if 문 효과 내기
define in_column = 'MGR'; --'MGR' or 'EMPNO'
define in_empno = 7698;
SELECT *
FROM emp
WHERE deptno = 30
AND '&in_column' = 'MGR'
AND mgr = '&in_empno'
UNION ALL
SELECT *
FROM emp
WHERE deptno = 30
AND '&in_column' = 'EMPNO'
AND empno = '&in_empno'
UNION ALL을 사용할 경우 쿼리문이 조금 길어지지만 조건 칼럼에 이퀄(=)을 사용하여 값을 대입하기 때문에 인덱스를 태워야 하는 경우 사용할 수 있다.
OR 연산자와 CASE 연산자를 사용하여 조회한 것과 동일한 결과가 조회된다. mgr, empno 칼럼에 인덱스를 태워야 하는 경우 속도가 빠를 수 있다.