기본 패턴
sql
SELECT
name,
COALESCE(nickname, name) AS display_name
FROM users
WHERE deleted_at IS NULL;설명
- PostgreSQL에서
NULL은0, 빈 문자열, 빈 컬렉션과 다릅니다. 값이 "없다"거나 "알 수 없다"는 상태를 나타내는 별도 개념입니다. - 이 때문에 SQL 논리는 보통의 참/거짓 2값 논리가 아니라 참/거짓/알 수 없음의 3값 논리로 동작합니다. 그래서
WHERE column = NULL같은 비교는 기대한 대로 작동하지 않습니다. NULL여부를 볼 때는IS NULL,IS NOT NULL을 사용하고, 대체값이 필요할 때는COALESCE로 첫 번째 non-null 값을 고릅니다.- 이 주제의 핵심은 "비어 있음"과 "모름"을 구분하는 감각입니다. 예를 들어 닉네임이 없는 것과, 아직 입력되지 않았다는 상태는 데이터 의미가 다를 수 있습니다.
- 쿼리가 복잡해질수록 NULL 처리는 조용한 버그 원인이 됩니다. join 결과, 집계 결과, 비교 연산에서 NULL이 어떻게 섞이는지 계속 의식하는 편이 좋습니다.
빠른 정리
| 표현 | 의미 |
|---|---|
IS NULL | NULL 여부 확인 |
IS NOT NULL | NULL 아님 확인 |
COALESCE(a, b) | 먼저 나오는 non-null 값 선택 |
NULLIF(a, b) | 두 값이 같으면 NULL 반환 |
| 핵심 포인트 | NULL은 일반 값과 다르게 비교됨 |
주의할 점
WHERE column = NULL은 거의 항상 의도와 다르게 동작합니다. NULL은 일반 비교 연산이 아니라
IS NULL / IS NOT NULL로 읽는 습관이 중요합니다.
참고 링크
2 sources