
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_date | price | prev_price | price_change |
|---|---|---|---|
| 2024-07-01 | 50000 | NULL | NULL ← 왜?! |
| 2024-07-02 | 52000 | 50000 | 2000 |
50000 - NULL = NULL
NULL = "모름"이니까, 계산 결과도 "모름"!
| 연산 | 결과 |
|---|---|
| 50000 - NULL | NULL |
| 50000 + NULL | NULL |
| 50000 * NULL | NULL |
| NULL / 50000 | NULL |
| NULL = NULL | NULL (FALSE 아님!) |
하나라도 NULL이면 → 결과는 NULL!
NULL이면 대체값으로 바꿔줌!
COALESCE(값, 대체값)
COALESCE(NULL, 0) → 0
COALESCE(50000, 0) → 50000
COALESCE(NULL, '없음') → '없음'
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_date | price | prev_price | price_change |
|---|---|---|---|
| 2024-07-01 | 50000 | 0 | 50000 ✅ |
| 2024-07-02 | 52000 | 50000 | 2000 |
| 함수 | 사용법 | 차이 |
|---|---|---|
| COALESCE | COALESCE(a, b, c) | 여러 개 가능! |
| IFNULL | IFNULL(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 첫 행 NULL | COALESCE(LAG(...), 0) |
-- 전일 대비 변화량 (첫날도 표시)
price - COALESCE(LAG(price) OVER(...), 0)
-- 할인가가 없으면 정가 표시
COALESCE(discount_price, original_price)
-- 닉네임 없으면 '익명' 표시
COALESCE(nickname, '익명')
NULL 만나면 COALESCE! 💪
