58. SQL - coalesce (NULL 연산과 COALESCE로 해결하기)

Jason·2026년 2월 1일

SQL

목록 보기
41/47

SQL 내가 틀린 것들 #58 — NULL 연산과 COALESCE로 해결하기


🤔 문제 상황

LAG로 전일 대비 변화량을 구했는데...

SELECT
  stock_date,
  price,
  LAG(price) OVER(ORDER BY stock_date) AS prev_price,
  price - LAG(price) OVER(ORDER BY stock_date) AS price_change
FROM stock_prices

결과

stock_datepriceprev_priceprice_change
2024-07-0150000NULLNULL ← 왜?!
2024-07-0252000500002000

💡 핵심: NULL과 연산하면 결과도 NULL!

50000 - NULL = NULL

NULL = "모름"이니까, 계산 결과도 "모름"!


📌 NULL 연산 규칙

연산결과
50000 - NULLNULL
50000 + NULLNULL
50000 * NULLNULL
NULL / 50000NULL
NULL = NULLNULL (FALSE 아님!)

하나라도 NULL이면 → 결과는 NULL!


🔥 해결책: COALESCE

NULL이면 대체값으로 바꿔줌!

문법

COALESCE(, 대체값)

예시

COALESCE(NULL, 0)0
COALESCE(50000, 0)50000
COALESCE(NULL, '없음')'없음'

✅ 적용: NULL 대신 0으로!

SELECT
  stock_date,
  price,
  COALESCE(LAG(price) OVER(ORDER BY stock_date), 0) AS prev_price,
  price - COALESCE(LAG(price) OVER(ORDER BY stock_date), 0) AS price_change
FROM stock_prices

결과

stock_datepriceprev_priceprice_change
2024-07-0150000050000
2024-07-0252000500002000

💡 COALESCE vs IFNULL

함수사용법차이
COALESCECOALESCE(a, b, c)여러 개 가능!
IFNULLIFNULL(a, b)2개만 가능 (MySQL)

예시

-- COALESCE: 첫 번째 NULL 아닌 값 반환
COALESCE(NULL, NULL, 100)100

-- IFNULL: 2개만
IFNULL(NULL, 100)100

COALESCE가 더 범용적! (표준 SQL)


📌 정리

상황해결책
NULL과 연산결과도 NULL!
NULL을 0으로COALESCE(값, 0)
NULL을 '없음'으로COALESCE(값, '없음')
LAG 첫 행 NULLCOALESCE(LAG(...), 0)

🎯 실무 활용

-- 전일 대비 변화량 (첫날도 표시)
price - COALESCE(LAG(price) OVER(...), 0)

-- 할인가가 없으면 정가 표시
COALESCE(discount_price, original_price)

-- 닉네임 없으면 '익명' 표시
COALESCE(nickname, '익명')

NULL 만나면 COALESCE! 💪

profile
Data Analyst | Thoughts Become Things. 할 수 있다고 생각하면 할 수 있다. 할 수 없다고 생각하면 할 수 없다. | www.linkedin.com/in/명수-제-7ab843200

0개의 댓글