오늘은 다시 NULL 처리 주제로 좀 더 깊게 들어가보고, 진짜 유용한 함수인 COALESCE()를 소개할게. 이 함수 덕분에 NULL 값이 있는 데이터도 깔끔하게 다룰 수 있어.
예를 들어보자: 직원 데이터가 담긴 테이블이 있는데, 몇몇 직원은 월급 정보가 없어. 만약 모든 월급을 올려주려고 하면 어떻게 될까? 별로 좋은 결과 안 나와. NULL이랑 연산하면 아무것도 못하거든. 그럼 NULL 월급을 0으로 바꾸고 싶으면? 바로 여기서 COALESCE()가 등장하지!
COALESCE()는 넘겨준 값들 중에서 첫 번째로 NULL이 아닌 값을 반환하는 함수야. 만약 모든 값이 NULL이면 그냥 NULL을 돌려줘. 쉽게 말해서, "제일 먼저 쓸만한 값 하나만 줘!" 이런 느낌이지.
문법
COALESCE(value1, value2, ..., value_n)
value1, value2, ..., value_n은 함수에 넘기는 값들이야. 이 중에서 NULL이 아닌 첫 번째 값을 반환해.
COALESCE() 사용 예제
예시 몇 개 보여줄게.
예제 1: NULL을 0으로 바꾸기
예를 들어, salaries 테이블이 있다고 해보자:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | NULL |
| 3 | Alex | 60000 |
| 4 | Anna | NULL |
전체 월급 합계를 구하고 싶으면 이렇게 하면 돼:
SELECT SUM(salary) AS total_salary
FROM salaries;
SUM() 함수는 NULL을 무시하니까 문제 없어.
근데 모든 직원한테 1000 보너스를 더해서 합계를 구하고 싶으면?
SELECT SUM(salary+1000) AS total_salary
FROM salaries;
이러면 결과가 이상해져. 그래서 COALESCE로 NULL을 0으로 바꿔주는 게 훨씬 좋아. 이렇게 해보자:
SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;
결과:
| total_salary |
|---|
| 110000 |
이렇게 하면 훨씬 안전하고 확실하지.
예제 2: NULL을 기본값으로 바꾸기
이번엔 students 테이블에 이름이랑 주소가 있다고 해보자:
| id | name | address |
|---|---|---|
| 1 | Anna | Kanne |
| 2 | Peter | NULL |
| 3 | Lisa | Painful |
| 4 | Alex | NULL |
주소가 NULL이면 "입력 안 됨"으로 바꿔주고 싶으면 이렇게 해:
SELECT name, COALESCE(address, '입력 안 됨') AS resolved_address
FROM students;
쿼리 결과:
| name | resolved_address |
|---|---|
| Anna | Kanne |
| Peter | 입력 안 됨 |
| Lisa | Painful |
| Alex | 입력 안 됨 |
예제 3: 여러 값 중에서 선택하기
가끔 NULL을 한 값이 아니라 여러 후보 중에서 바꿔야 할 때도 있어. 예를 들어, 이름, 별명, 아니면 "이름 없음" 중에서 하나를 보여주고 싶을 때. users 테이블:
| user_id | first_name | short_name | full_name |
|---|---|---|---|
| 1 | John | Jonny | Johnny Walker |
| 2 | NULL |
Pete | Peter Kamen |
| 3 | NULL |
NULL |
쿼리:
SELECT user_id,
COALESCE(first_name, short_name, '이름 없음') AS display_name
FROM users;
결과:
| user_id | display_name |
|---|---|
| 1 | John |
| 2 | Pete |
| 3 | 이름 없음 |
COALESCE() 실전 활용
실제로 COALESCE()는 데이터가 완벽하지 않을 때 진짜 구세주야.
어떤 상황에서 도움이 되는지 볼까?
예제 1: 텍스트 필드 값 바꾸기
원본 customers 테이블:
| id | name | address |
|---|---|---|
| 1 | Alex Lin | 123 Maple St |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 456 Oak Ave |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 789 Pine Rd |
쿼리:
SELECT name, COALESCE(address, '입력 안 됨') AS address
FROM customers;
결과:
| name | address |
|---|---|
| Alex Lin | 123 Maple St |
| Maria Chi | 입력 안 됨 |
| Anna Song | 456 Oak Ave |
| Otto Art | 입력 안 됨 |
| Liam Park | 789 Pine Rd |
예제 2: 리포트용 데이터 준비
원본 sales 테이블:
| id | product | price |
|---|---|---|
| 1 | Widget A | 100 |
| 2 | Widget B | NULL |
| 3 | Widget C | 250 |
| 4 | Widget D | NULL |
| 5 | Widget E | 300 |
쿼리:
SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;
결과:
| total_sales |
|---|
| 650 |
COALESCE() 쓸 때 흔한 실수
COALESCE()가 간단하고 만능 같아 보여도, 몇 가지 주의할 점이 있어.
데이터 타입 안 맞음. COALESCE()에 넘기는 값들은 데이터 타입이 맞아야 해. 예를 들어, 문자열이랑 숫자를 섞으면 안 돼.
-- 에러
SELECT COALESCE(salary, '입력 안 됨') FROM employees;
-- salary는 숫자 필드고, '입력 안 됨'은 텍스트야.
인자 순서 신경 안 씀. COALESCE()는 첫 번째로 NULL이 아닌 값을 반환하니까, 인자 순서가 진짜 중요해.
GO TO FULL VERSION