ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [오라클] ORA-01476 : 제수가 0 입니다 Divisor is equal to zero 원인 및 해결 방법
    문제해결/Oracle 2023. 1. 18. 11:45
    반응형

    [오라클]
    ORA-01476
    Error: # 1476
    제수가 0 입니다
    Divisor is equal to zero

     

     

     

     

    발생 원인
    이거 인용문구 어케닫지🥲


    SQL 쿼리 중 제수(나누는 수)가 0인 경우에 발생하는 에러이다.

    (이과인 내가 이런 실수를 한다고? 이건 오라클 문제야!)



    일반적으로 100/0과 같은 수식이 잘못된 것은 바로 파악이 가능하고, 위와 같은 수식을 작성하는 경우는 없겠지만, 본인의 경우 컬럼간의 계산식을 넣을 때 제수에 해당하는 컬럼 중 데이터가 0이 존재할 경우를 인지하지 못하여 발생했다.

    (돌이켜보면 문제는 항상 나였다)



    해당 컬럼에 데이터의 유형을 보장할 수 없다면 안전장치를 아래와 같이 마련해두자.


    해결 방법

     

     

     

    • 예시

     

    SELECT COLUMN1 / COLUMN2 
      FROM TABLE_NAME

    (원래 업무할 때는 대부분 alias를 붙이지만 여기서는 귀찮아서 못하겠다)



    위와 같은 쿼리를 사용한다고 할 때 COLUMN2 의 데이터에 0인 경우가 존재하면 ORA-01476 에러가 발생한다. 해결 방법은 COLUMN2의 데이터가 0인 경우를 만나면 예외처리를 해주는 것!

    • CASE WHEN 사용

     

    SELECT CASE WHEN COLUMN2 = 0 THEN 0 --예외처리
                ELSE COLUMN1 / COLUMN2
           END
      FROM TABLE_NAME

    CASE WHEN으로 COLUMN2가 0인 경우에 예외 처리를 해주고 아닌 경우 수식을 사용한다.( 예외처리 결과값은 요구조건에 맞게 변경)


    • DECODE 사용

     

    SELECT DECODE(COLUMN2,0,0,COLUMN1 / COLUMN2)
      FROM TABLE_NAME

    DECODE 함수를 지원한다면 사용할 수 있는 방법.
    첫번째 예시와 마찬가지로 COLUMN2가 0인 경우에 예외 처리(0)를 해주고, 아닌 경우 나눗셈 수식을 사용한다.

    • NVL, NULLIF 사용

     

    SELECT NVL(A/NULLIF(COLUMN2,0),0)
      FROM TABLE_NAME

    NULLIF, NVL 참고 출처
    https://yulsfamily.tistory.com/315

    NULL을 수식계산에 사용하는 경우 무조건 NULL이라는 점을 사용한 방법.

    COLUMN2가 0인 경우엔 NULL을 반환하여 A와 나누고, 그 결과값이 NULL인 경우 0을 반환한다.

    검색하다가 이런 방법도 있구나 해서 참고용으로 작성한다.
    (개인적으로 해당 방법에 이점이 있는지 모르겠다. 창의적인 문제풀이같은 느낌)

     

     

     

     

    반응형

    댓글

Designed by Tistory.