개발이야기/PostgreSQL

[PostgreSQL] division by zero 에러 해결하기 (CASE문, NULLIF, COALESCE)

후린개발자 2024. 8. 2.
반응형

division by zero 오류는 SQL 쿼리에서 숫자를 0으로 나누려고 시도할 때 발생하며, 데이터 무결성과 애플리케이션의 안정성을 위협할 수 있습니다. 
PostgreSQL과 같은 관계형 데이터베이스 관리 시스템(RDBMS)에서는 이러한 상황을 감지하고 에러를 발생시켜, 예상치 못한 계산 오류나 시스템 중단을 방지합니다. 

아래 예제 쿼리는 division by zero를 오류를 해결하기 위해 CASE문, NULLIF, COALESCE를 사용했습니다.

 

 

division by zero

0으로 나누기를 시도할 때 발생
ERROR:  division by zero
SQL state: 22012​

 

-에러 메시지: "division by zero" - 0으로 나누기를 시도했음을 나타냅니다.

-SQL 상태 코드: 22012 - SQL 표준에 정의된 상태 코드로, "division by zero" 오류를 나타냅니다.

 

 

예제 테이블 생성 및 데이터 삽입

CREATE TABLE scheduler.tbl_example_table (
    id SERIAL PRIMARY KEY,
    numerator INTEGER NOT NULL,
    divisor INTEGER NOT NULL
);

INSERT INTO scheduler.tbl_example_table (numerator, divisor) VALUES
(10, 2),
(20, 4),
(30, 0),
(40, 5);

 

 

 

에러발생

SELECT 10 / 0;

SELECT 
    id,
    numerator,
    divisor,
    numerator / divisor
FROM scheduler.tbl_example_table;

 

 

 

CASE 문 사용

SELECT 
    id,
    numerator,
    divisor,
    CASE 
        WHEN divisor = 0 THEN 'Cannot divide by zero'
        ELSE (numerator / divisor)::text -- 결과를 텍스트로 변환
    END AS result
FROM scheduler.tbl_example_table;

 

-CASE문을 사용하여 나누기 전에 나누는 값이 0인지 확인합니다.

 

 

 

NULLIF 함수 사용

SELECT 
    id,
    numerator,
    divisor,
    numerator / NULLIF(divisor, 0) AS result
FROM scheduler.tbl_example_table;

 

-NULLIF 함수는 두 인자가 같으면 NULL을 반환하고, 그렇지 않으면 첫 번째 인자를 반환합니다. 0으로 나누는 것을 방지할 수 있습니다.

 

 

 

COALESCE 함수와 NULLIF 사용

SELECT 
    id,
    numerator,
    divisor,
    COALESCE(numerator / NULLIF(divisor, 0), 0) AS result
FROM scheduler.tbl_example_table;

 

-COALESCE 함수를 사용하여 NULL 값을 다른 값으로 대체할 수 있습니다. 0으로 나누는 경우에 결과를 0으로 대체할 수 있습니다.

 

반응형

댓글

💲 추천 글