[Oracle] CASE WHEN 서브쿼리 사용법 (내부 SELECT)
- 데이터베이스/오라클
- 2023. 8. 20.
오라클 쿼리문에서 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"를 반환한다.