ORA-01476: 제수가 0 입니다 해결하기 (ORA-01476: divisor is equal to zero)

ORA-01476: 제수가 0 입니다 오류가 발생하였을 때, 해결하는 방법에 대해 안내해 드리겠습니다. 우선 제수가 무엇인지에 대해 알아보고, 왜 제수가 0일 때 문제인지, 그리고 해결방법에 대해 알아보도록 하겠습니다.

  • 제수가 0
  • DECODE로 해결하기
  • CASE로 해결하기
  • NULLIF로 해결하기

제수

제수는 분모를 의미합니다. 결국 나누는 숫자가 0이어서 오류가 발생한 것입니다.

왜 제수를 0으로 나눌 때 예외가 발생하는가?

계산기나 엑셀에서 분모를 0으로 나눌 때 "나눌 수 없습니다" 라거나 NaN와 같은 문구가 표시됩니다.
왜 나누지 못하는 것일까요?
나눗셈은 뺄셈의 반복이기 때문입니다.

예를 들면, 10 나누기 4는 10을 4로 2번 빼고 난 나머지 2를 0.5 배수만큼 다시 뺍니다.
다음과 같습니다.

  • 10 - 4 = 6
  • 6 - 4 = 2
  • 2 - 4*0.5 = 0

결국 0으로 나눈다는 것은 0으로 분자값을 계속 빼나가는 것입니다.

어떤 수에 0을 빼봤자 수에는 변함이 없으니 무한히 빼게 되는 것입니다.

또한 곱연산 시점에서 바라보면 다음과 같습니다.

모든 수에 0을 곱하면 0이 됩니다. 1이든, 3이든 0을 곱하면 0입니다. 예를 들면 다음과 같습니다.

  • 1 * 0 = 0
  • 3 * 0 = 0

0으로 나누기가 가능하다면,

  • 1 = 0/0
  • 3 = 0/0

이 되어 '1 = 3'이 참이 되는 현상이 발생합니다.

그리하여 0으로 나눈다는 것은 정의하지 않습니다.

DECODE로 해결하기

ORA-01476 제수가 0 입니다
SELECT 분자, 분모, NVL (분자 / DECODE (분모, 0, NULL, 분모), 0)
  FROM TABLENAME;

DECODE는 DECODE(expr1, expr2, expr3, ..., exprN) 형태로 사용합니다.

expr1이 expr2면 expr3값을 아니면 exprN을 반환합니다.

DECODE(분모, 0, NULL, 분모)는 분모가 0이면 NULL을 반환하고 아니면 분모를 반환합니다.

CASE로 해결하기

SELECT 분자,
       분모,
       NVL (CASE 분모 WHEN 0 THEN NULL ELSE 분자 / 분모 END, 0)
  FROM TABLENAME;

DECODE는 CASE로 변환할 수 있습니다. 그 반대의 경우도 마찬가지입니다.

분모가 0일 때는 0, 아닐 때는 나눗셈을 진행하도록 합니다.

NULLIF로 해결하기

SELECT 분자, 분모, NVL (분자 / NULLIF (분모, 0), 0) FROM TABLENAME;

NULLIF 는 NULLIF(expr1, expr2)로 표현하며 expr1과 expr2가 같다면 NULL을 반환하고 다르면 expr1을 반환합니다.

null if expr1 equal to expr2 로 외우시면 좋습니다. (제가 이 함수를 기억하는 방법입니다)

NULLIF (분모, 0) 를 통해 분모가 0인 경우 NULL을 반환하도록 하였습니다.

댓글