wrkbrs

[PostgreSQL] null 체크하는 방법 - COALESCE 함수 본문

PostgreSQL

[PostgreSQL] null 체크하는 방법 - COALESCE 함수

zcarc 2019. 7. 17. 14:41

NullPointerException.. 

프로그래머라면 다양한 환경에서 직면할 수 있는 가장 흔하면서도 치명적인 에러입니다.

0 또는 " "같은 공백도 컴퓨터 상에서는 존재하는 값인 반면, null은 값이 존재하지 않는다는 뜻이죠.

 

그렇듯이 예외처리할 때 null체크를 가장 기본적으로 하지요.

마찬가지로 DB에서도 군데군데 존재하는 null값 데이터들을 처리해야 할때가 생길 것이고,

PostgreSQL에서는 이러한 문제들을 COALESCE 함수로 간단하게 처리할 수 있습니다.

 

postgresql에서 null 체크하는 방법

- COALESCE 함수 -

문법


COALESCE(args1, args2, ... )

 

SELECT COALESCE(name, age, birthday, 'NO DATA', ... )

데이터 셋


nameagebirthdate

moogii [null] 2017-08-31
happy 20 2017-07-17
bori 15 [null]
bburi [null] [null]

COALESCE 함수


'coalesce'라는 단어의 뜻은 '유착하다, 합체하다, 합동하다'라고 하네요.

어떻게 합동하는지(또는 합체할 수 있는지?) 실험해보도록 하겠습니다.

 

  • CASE1 : 컬럼의 대체

     

    [쿼리]

    SELECT

        name,

        age,

        birthdate,

        COALESCE(age, birthdate) AS test

    FROM

        user_tb

     

    [결과]

    nameagebirthdatetest
    moogii [null] 2017-08-31 2017-08-31
    happy 20 2017-07-17 20
    bori 15 [null] 15
    bburi [null] [null] [null]

     

    위 결과처럼 컬럼들을 비교하여 null값일 때 다른 컬럼으로 대체할 수 있습니다.

     

    * 결과값 결정 - null 체크 하는 순서는?

    가장 왼쪽의 첫번째 인자값을 기준으로 null값이면 오른쪽의 값을 평가하여 null이 아닌 데이터로 결정하여 리턴합니다.

    하지만 마지막까지 null값이라면 리턴값 역시 null을 반환합니다.

     

    "COALESCE only evaluates the arguments that are needed to determine the result; that is, arguments to the right of the first non-null argument are not evaluated."

     

    "Null is returned only if all arguments are null."

     

    postgresql의 공식문서에서도 위와 같이 이에 대한 내용을 잘 명시하고 있습니다.

     

  • CASE2 : 지정 문자열로의 대체

    CASE1의 4번째 레코드처럼 비교 컬럼이 전부 null일 때 특정 문자열로 대체하고 싶다면?

     

    [쿼리]

    SELECT

        name,

        age,

        birthdate,

        COALESCE(age, birthdate, 'NO DATA'AS test1,

        COALESCE('NO DATA', birthdate, age) AS test2

    FROM

        user_tb

     

    [결과]

    nameagebirthdatetest1test2
    moogii [null] 2017-08-31 2017-08-31 NO DATA
    happy 20 2017-07-17 20 NO DATA
    bori 15 [null] 15 NO DATA
    bburi [null] [null] NO DATA NO DATA

     

    CASE1에 본 결과값 결정에 다라 실제로 문자열 'NO DATA'의 인자값 순서를 처음으로 설정시, 모든 컬럼에서 'NO DATA'를 반환하는 결과값을 볼 수 있습니다.

     

    여러 데이터들이 합동하여 null을 제거하는 것을 보아하니,

    'coalesce'란 단어의 의미를 진정하게 찾을 수 있었던 CASE라고 생각됩니다.

     

  • CASE3 : 난 null이 좋아!

    혹시나 null을 첫번째 인자로 넣는다면 모두 null을 리턴할까?

     

    [쿼리]

    SELECT

        name,

        age,

        birthdate,

        COALESCE(null, age, birthdate, 'NO DATA'AS test

    FROM

        user_tb

     

    [결과]

    nameagebirthdatetest
    moogii [null] 2017-08-31 2017-08-31
    happy 20 2017-07-17 20
    bori 15 [null] 15
    bburi [null] [null] NO DATA

     

    결과에서 보이듯이, 이 함수는 null을 체크하는 함수로 첫번째 인자값이 null이므로 다음 인자값을 평가합니다.

    한마디로 자원낭비, COALESCE 함수에서의 null값은 부적절한 인자값인 것이죠. 

     

    CASE3은 효율적인 리소스 관리를 위한 좋은 실험이었던걸로 치고, 이쯤에서 실험을 마무리 짓도록 하지요 :)

참고자료


 

PostgreSQL: The world's most advanced open source database

PostgreSQL is a powerful, open source object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance. There is a wealth of information to be found descr

www.postgresql.org

 

 

https://blog.azulpintor.io/3