이번엔 신비한 NULL을 다루는 또 다른 함수 NULLIF()에 대해 얘기해볼게. 이 함수는 특정 값을 NULL로 바꿔서 데이터 처리할 때 유용하게 써먹을 수 있어. 벨트 꽉 매고, 재밌는 여행 시작하자!
NULLIF() 함수는 PostgreSQL에서 진짜 쓸만한 도구야. 두 값을 비교해서 같으면 NULL을, 다르면 첫 번째 값을 돌려줘. 마치 "이 값들이 똑같으면 그냥 무시하자!"라고 말하는 것 같지.
함수의 간단한 문법은 이래:
NULLIF(value1, value2)
value1이랑 value2가 같으면 결과는 NULL이야. 다르면 결과는 value1이야.
예시:
SELECT NULLIF(10, 10); -- 결과: NULL
SELECT NULLIF(10, 20); -- 결과: 10
SELECT NULLIF('hello', 'hello'); -- 결과: NULL
SELECT NULLIF('hello', 'world'); -- 결과: 'hello'
쉽지? 이제 이 함수를 실제 문제에 어떻게 써먹는지 보자.
예시 1: 0으로 나누기 방지
0으로 나누기는 모든 개발자의 악몽이지. SQL에서 0으로 나누면 에러가 나와. 이럴 때 NULLIF()가 딱이야.
상황을 상상해봐: sales 테이블에 revenue(수익)랑 expenses(지출) 컬럼이 있어. 우리는 수익률(revenue / expenses)을 계산하고 싶은데, 가끔 지출이 0일 때가 있지. 그냥 쿼리 날리면 0으로 나누기 에러가 나버려.
sales 테이블:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
잘못된 쿼리:
SELECT revenue / expenses AS profitability
FROM sales;
-- 에러: 0으로 나누기!
NULLIF()로 해결:
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
결과:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
이제 expenses가 0이면 NULLIF(expenses, 0)이 NULL을 돌려주고, NULL로 나누면 에러 대신 NULL이 결과로 나와.
예시 2: 같은 값 NULL로 바꾸기
학생 데이터가 담긴 테이블이 있다고 해보자. first_name이랑 preferred_name 컬럼이 있어. 어떤 학생은 본명 그대로 쓰고, 어떤 학생은 별명을 쓰지. 만약 두 이름이 같으면 preferred_name을 굳이 보여줄 필요 없잖아.
students 테이블:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
NULLIF() 쿼리:
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
결과:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
preferred_name이랑 first_name이 같으면 결과가 NULL이야.
예시 3: 데이터 필터링
가끔 두 컬럼 값이 다를 때만 행을 뽑고 싶을 때가 있어. 예를 들어, 주문 테이블에 original_price랑 discounted_price가 있는데, 할인된 주문만 찾고 싶을 때!
orders 테이블:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
NULLIF() 쿼리:
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
결과:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
할인된 주문만 결과에 나와.
NULLIF() 실전 케이스
케이스 1: 선택적 값 고르기
데이터 다룰 때, 여러 컬럼 중에서 특정 값을 제외하고 골라야 할 때가 있어. 예를 들어, 직원 리스트에 base_salary랑 bonus가 있는데, 보너스가 0이면 999로 바꿔주고 싶을 때!
employees 테이블:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
NULLIF() 쿼리:
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
결과:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
bonus가 0이면 999로 바뀌는 거지.
케이스 2: 행 개수 세기
NULLIF()를 써서 복잡한 필터 조건도 쉽게 만들 수 있어. 예를 들어, 사용자 테이블에서 전체 유저 수랑 guest가 아닌 등록 유저 수를 한 번에 세고 싶을 때!
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
이렇게 NULLIF() 하나만으로 에러 방지부터 코드 가독성까지 여러 문제를 쉽게 해결할 수 있어. 이제 이 함수가 어떻게 동작하는지 아니까, PostgreSQL 데이터 다루는 실력 한 단계 업!
GO TO FULL VERSION