[SQL - Frequently Used Code] 제수가 0입니다
2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents
'ORA-01476 제수가 0 입니다' 와 같은 오류를 만날 때가 있죠. 눈치채셨겟지만 분모가 0인경우에 발생하는 문제입니다. 기본적으로는 분모가 0이 되지 않도록 사전 처리를 하는 것이 좋지만, 그렇지 않은경우에는 오류방지 처리를 해두고 SQL 쿼리를 작성해야 합니다. 사실 저는 이미 이 에러도 수 없이 경험해봤고 머리속에 넣어두고 있지만 종종 만나는 에러이기도 합니다. 몇 가지 오류방지 방법을 소개하겠습니다.
1) Decode 함수를 이용한 방법
Decode 함수는 SQL표준함수는 아니고 Oracle에서만 활용되는 함수입니다.
DECODE는 Case when 절과 유사한 역할을 하지만 문법이 좀더 간결하다는 특징이 있습니다. Sytax는 아래와 같습니다.
DECODE(expression, search1, result1, search2, result2, ..., default_result)
SELECT
DECODE(GENDER, 'M', '남자', 'F', '여자', '기타') AS gender_text
FROM USERS;
'GENDER'라는 expression이 'M'값을 가질 때는 '남자'로, 'F'값을 가질 때는 '여자'로 변환을 하고 만약 둘 다 아니라면 '기타'로 변환하게 되는 것이죠. 원라인으로 표현을 할 수 있게되는 건데 만약 case when을 사용한다면 아래와 같이 써야할 겁니다.
SELECT
CASE
WHEN GENDER = 'M' THEN '남자'
WHEN GENDER = 'F' THEN '여자'
ELSE '기타'
END AS gender_text
FROM USERS;
COL2가 0일 때는 0의 값을, COL2가 0이 아닐 때는 COL1/COL2를 반환하라는 쿼리라고 할 수 있습니다.
SELECT DECODE(COL2, 0, 0, COL1/COL2)
FROM TABLE_NAME
2) NVL과 DECODE를 같이 활용하는 방법
아래 코드는 먼저 DECODE를 이용해서 COL2가 0일 때는 NULL로, 0이 아닐 때는 그대로 둡니다. 다시 여기서 COL1/COL2를 계산하게 되는데 COL2이 NULL이라면 COL1/COL2 계산결과도 NULL이 되겠죠. 마지막으로 여기에 NVL 함수를 적용함으로써 NULL인 경우 최종값을 0으로 대체해줍니다.
SELECT NVL(COL1/DECODE(COL2, 0, NULL, COL2), 0)
FROM TABLE_NAME
3) NVL과 NULLIF를 같이 활용하는 방법
2) 방법과 거의 유사한데 분모값이 0일 때 NULL로 바꿔주는 함수를 DECODE가 아닌 NULLIF함수를 썼다는 것만 다릅니다.
SELECT NVL(COL1/NULLIF(COL2, 0), 0)
FROM TABLE_NAME