[Oracle] CASE WHEN 서브쿼리 사용법 (내부 SELECT)

오라클 쿼리문에서 CASE 표현식을 사용할 때 조건절에 서브쿼리(Subquery)를 사용하여 조건을 부여할 수 있다. CASE WHEN 안에서 SELECT 문을 사용할 수 있으며, 조건절에서 서브쿼리를 사용할 때는 EXISTS 연산자, IN 연산자, 집계함수와 부등호 연산자를 주로 많이 사용한다.

 

목차

 

EXISTS 연산자와 서브쿼리 사용법

SELECT a.empno
     , a.ename
     , a.deptno
     , a.mgr
     , CASE WHEN EXISTS(SELECT 1
                          FROM emp aa
                         WHERE aa.empno = a.mgr
                           AND aa.deptno = a.deptno) THEN 'Y'
       END AS mgr_tgt
  FROM emp a
 WHERE a.job IN ('MANAGER', 'SALESMAN', 'CLERK')

 

 

EXISTS 연산자는 서브쿼리의 데이터가 존재하면 True, 존재하지 않으면 False를 반환한다.

담당 매너지와 같은 부서코드(deptno)를 가졌으면 "Y"를 표시하는 예제이다.

 

IN 연산자와 서브쿼리 사용법

SELECT a.empno
     , a.ename
     , a.deptno
     , a.mgr
     , CASE WHEN a.deptno IN (SELECT aa.deptno
                                FROM emp aa
                               WHERE aa.empno = a.mgr) THEN 'Y'
       END AS mgr_tgt
  FROM emp a
 WHERE a.job IN ('MANAGER', 'SALESMAN', 'CLERK')

 

 

IN 연산자도 EXISTS 연산자와 동일한 결과를 얻을 수 있다.

담당 매니저의 부서코드(deptno)를 조회 후 IN 연산자에 대입하여 자신의 부서코드와 동일한지 판단한다.

 

쿼리문의 상황에 따라서 EXISTS, IN 연산자를 구분하여 사용할 수 있지만, EXISTS 연산자를 사용하는 것이 조금 더 깔끔해 보인다.

 

집계함수와 서브쿼리 사용법

SELECT a.empno
     , a.ename
     , a.job
     , a.sal
     , CASE WHEN (SELECT AVG(aa.sal)
                    FROM emp aa
                   WHERE aa.job = a.job) < a.sal THEN 'Y'
       END AS high_sal
  FROM emp a
 WHERE a.job IN ('MANAGER', 'SALESMAN', 'CLERK')
 ORDER BY job, ename

 

 

집계함수(SUM, COUNT, AVG, MIN, MAX 등)와 부등호 연산자(>, <, =, =>, <=)를 사용하여 조건을 부여할 수 있다.

위의 예제는 자신의 직업 평균 급여보다 자신의 급여가 높을 경우 "Y"를 표시하는 예제이다.

 

CASE WHEN~THEN 서브쿼리 사용법

SELECT a.empno
     , a.ename
     , a.mgr
     , CASE WHEN a.mgr IS NOT NULL THEN
                 (SELECT aa.ename
                    FROM emp aa
                   WHERE aa.empno = a.mgr)
            ELSE
                 'ZZZZZZ'
       END AS mgr_name
  FROM emp a
 WHERE a.job IN ('PRESIDENT', 'MANAGER', 'SALESMAN')
 ORDER BY job, ename

 

 

CASE WHEN~THEN 이후 결과를 반환할 때 서브쿼리를 사용하여 결과를 반환할 수 있다.

이때 사용하는 서브쿼리는 스칼라 서브쿼리이며 하나의 열 하나의 행을 반환하도록 작성해야 한다.

위의 예제는 해당 직원의 매니저가 있을 경우 매니저 성명을 반환하고, 매니저가 없으면 "ZZZZZZ"를 반환한다.

 

 

[Oracle] 오라클 CASE WHEN 사용법 총정리

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

gent.tistory.com

 

[Oracle] CASE WHEN 조건 여러개 (다중 조건)

오라클 쿼리문에서 CASE WHEN 표현식의 조건을 여러개 부여하기 위해서는 WHEN~THEN을 반복해서 사용할 수 있으며, 다중 조건을 부여할 수 있다. 하나의 조건절(WHEN~THEN)에서 여러개 칼럼을 조건으로

gent.tistory.com

 

[Oracle] 오라클 EXISTS, NOT EXISTS 사용법

오라클에서 EXISTS( ) 함수를 처음 접하면 조금 어려움 느낌이 들 수도 있다. EXISTS를 사용하지 않아도 비슷한 결과를 만들 수 있는 기능이 많기 때문에, EXISTS에 대해 자세히 익히지 않고 넘어가는

gent.tistory.com

 

[Oracle] 오라클 서브쿼리 종류 및 사용법

오라클에서 쿼리문을 작성하다 보면 서브 쿼리(subquery)를 자주 접하게 된다. 서브 쿼리를 처음 접하면 아주 복잡하게 느껴지는데, 기능을 조금만 익히면 쿼리문을 작성할 때 아주 유용하게 사용

gent.tistory.com

 

 

댓글

Designed by JB FACTORY