오라클 CASE문 안에 SELECT문을 넣으면 오류가 나는 이유

오라클에서 CASE문 안에 SELECT문을 넣다 보면 종종 오류가 나는 경우가 있습니다. 저도 처음엔 왜 그런지 헷갈렸는데, 몇 가지 대표적인 이유가 있더라고요. 아래에서 정리해봅니다.

1. SELECT 결과가 여러 행일 때

CASE 안에 들어가는 SELECT는 무조건 한 개의 값(스칼라)만 나와야 합니다. 만약 여러 행이나 여러 컬럼을 반환하면 바로 에러가 납니다.

SELECT CASE 
         WHEN deptno = 10 
         THEN (SELECT ename FROM emp) 
         ELSE 'OTHERS'
       END
FROM dual;

이 경우에는 ROWNUM = 1 같은 조건을 붙여서 한 건만 나오게 해주면 해결됩니다.

SELECT CASE 
         WHEN deptno = 10 
         THEN (SELECT ename FROM emp 
               WHERE deptno = 10 
                 AND ROWNUM = 1)
         ELSE 'OTHERS'
       END
FROM dual;

2. 괄호나 구문 배치가 잘못됐을 때

CASE문 안에 SELECT를 바로 넣으면 구문 오류가 납니다. 항상 괄호로 감싸야 하고, 비교 연산자와 함께 써야 정상 동작합니다.

SELECT CASE 
         WHEN (SELECT COUNT(*) FROM emp) > 0 
         THEN 'Y'
         ELSE 'N'
       END
FROM dual;

3. 데이터 타입이 안 맞을 때

CASE문은 각 THEN 절이 같은 타입이어야 합니다. 숫자와 문자열을 섞어 쓰면 에러가 발생하죠.

SELECT CASE 
         WHEN deptno = 10 
         THEN TO_CHAR((SELECT COUNT(*) FROM emp))
         ELSE 'OTHERS'
       END
FROM dual;

정리

  • SELECT 결과는 반드시 단일 값이어야 한다.
  • 괄호로 감싸서 구문 오류를 피한다.
  • 각 THEN 절의 데이터 타입을 맞춰준다.
  • PL/SQL에서는 세미콜론이나 예약어 위치를 특히 주의한다.

저도 처음엔 오류 메시지 보고 당황했는데, 위 규칙들만 기억하면 꽤 쉽게 해결할 수 있었습니다. 비슷한 문제 겪으신 분들께 도움이 되길 바랍니다. 😊

'ORACLE' 카테고리의 다른 글

오라클 쿼리에서 JSON 변환  (2) 2025.07.31
오라클 병렬처리 Parallel Processing  (0) 2021.01.23
ORACLE 유저 별 테이블 비교  (0) 2021.01.23
PLSQL DEVELOPER 환경설정  (0) 2020.05.20
[ORALCE] GREATEST, LEAST  (0) 2019.03.08