오라클 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 |