PostgreSQL조회와 필터링

NULL, COALESCE, 3값 논리

PostgreSQL에서 NULL이 단순 빈값이 아니라 별도 의미를 가지는 값이라는 점과, COALESCE 및 3값 논리를 어떻게 읽어야 하는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

sql
SELECT
  name,
  COALESCE(nickname, name) AS display_name
FROM users
WHERE deleted_at IS NULL;

설명

  • PostgreSQL에서 NULL0, 빈 문자열, 빈 컬렉션과 다릅니다. 값이 "없다"거나 "알 수 없다"는 상태를 나타내는 별도 개념입니다.
  • 이 때문에 SQL 논리는 보통의 참/거짓 2값 논리가 아니라 참/거짓/알 수 없음의 3값 논리로 동작합니다. 그래서 WHERE column = NULL 같은 비교는 기대한 대로 작동하지 않습니다.
  • NULL 여부를 볼 때는 IS NULL, IS NOT NULL을 사용하고, 대체값이 필요할 때는 COALESCE로 첫 번째 non-null 값을 고릅니다.
  • 이 주제의 핵심은 "비어 있음"과 "모름"을 구분하는 감각입니다. 예를 들어 닉네임이 없는 것과, 아직 입력되지 않았다는 상태는 데이터 의미가 다를 수 있습니다.
  • 쿼리가 복잡해질수록 NULL 처리는 조용한 버그 원인이 됩니다. join 결과, 집계 결과, 비교 연산에서 NULL이 어떻게 섞이는지 계속 의식하는 편이 좋습니다.

빠른 정리

표현의미
IS NULLNULL 여부 확인
IS NOT NULLNULL 아님 확인
COALESCE(a, b)먼저 나오는 non-null 값 선택
NULLIF(a, b)두 값이 같으면 NULL 반환
핵심 포인트NULL은 일반 값과 다르게 비교됨

주의할 점

WHERE column = NULL은 거의 항상 의도와 다르게 동작합니다. NULL은 일반 비교 연산이 아니라 IS NULL / IS NOT NULL로 읽는 습관이 중요합니다.

참고 링크

2 sources