[Oracle] 오라클 WHERE 절에 if 문 사용법 (CASE WHEN)

오라클의 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 칼럼에 인덱스를 태워야 하는 경우 속도가 빠를 수 있다.

 

 

[Oracle] 오라클 CASE WHEN 표현식 사용법

오라클에서 if 문과 비슷한 기능을 하는 DECODE 함수가 있다. 그러나 DECODE 함수는 조건이 많아지면 가독성이 떨어지고 복잡해지며, 가장 큰 문제는 오라클 SQL에서만 사용할 수 있는 비표준 함수이

gent.tistory.com

 

[Oracle] 오라클 UNION, UNION ALL 사용법

오라클에서 여러 개의 SELECT 문 결과를 합치기 위해서는 UNION, UNION ALL을 사용하면 된다. UNION을 사용할 경우 합쳐진 결과에서 중복을 제거한 결과를 반환하고, UNION ALL을 사용하면 중복을 제거하지

gent.tistory.com

 

댓글

Designed by JB FACTORY