[SQL] NULL 값 처리 - IFNULL, COALESCE, NULLIF, CASE

Hyunjun Kim·2024년 9월 25일
0

SQL

목록 보기
2/44

NULL 이란 무엇인가?

NULL 처리 함수 종류

1. IFNULL(expr1, expr2) (MySQL 전용)

설명: expr1이 NULL이면 expr2를 반환하고, 그렇지 않으면 expr1을 반환합니다.

SELECT IFNULL(customer_name, 'Unknown') FROM customers;

고객 이름이 NULL인 경우 'Unknown'으로 대체합니다.

2. COALESCE(expr1, expr2, ...)

설명: COALESCE는 첫 번째 NULL이 아닌 값을 반환합니다. 여러 인수를 받을 수 있으며, 각 인수를 순서대로 평가하여 첫 번째로 NULL이 아닌 값을 반환합니다.

SELECT COALESCE(phone_number, email, 
'No contact information') FROM contacts;

연락처가 NULL이면 이메일을 사용하고, 둘 다 NULL일 경우 'No contact information'을 반환합니다.

3. NULLIF(expr1, expr2)

설명: expr1과 expr2가 동일하면 NULL을 반환하고, 그렇지 않으면 expr1을 반환합니다. 주로 값이 특정 조건과 같을 때 그 값을 NULL로 변환하는 데 사용됩니다.

SELECT NULLIF(salary, 0) FROM employees;

급여가 0이면 NULL을 반환하고, 그렇지 않으면 급여 값을 반환합니다.

4. CASE

설명: CASE 문은 IF-ELSE 문과 유사하게 조건에 따라 여러 값을 선택할 수 있습니다. 더 복잡한 논리를 적용할 수 있는 유연한 방법입니다.

SELECT 
  CASE 
    WHEN age < 18 THEN 'Minor'
    WHEN age >= 18 AND age < 65 THEN 'Adult'
    ELSE 'Senior'
  END AS age_group
FROM people;

나이에 따라 'Minor', 'Adult', 'Senior'를 반환합니다.

NULL 처리 문제

문제 1

customers 테이블에서 고객의 first_name이 NULL일 경우 'No First Name'으로 표시하고, last_name이 NULL일 경우 'No Last Name'으로 표시하여 각 고객의 이름을 출력하세요.

테이블 구조:

  • customers: 고객 정보
    - customer_id: 고객 ID
    - first_name: 이름
    - last_name: 성
SELECT customer_id, 
       IFNULL(first_name, 'No First Name') AS first_name, 
       IFNULL(last_name, 'No Last Name') AS last_name
FROM customers;

문제 2

employees 테이블에서 phone_number가 NULL이면 email을, 둘 다 NULL이면 'No Contact Info'를 반환하세요. 그리고 직원들의 salary가 0이면 NULL로 처리하여 출력하세요.

테이블 구조:

  • employees: 직원 정보
    - employee_id: 직원 ID
    - phone_number: 전화번호
    - email: 이메일
    - salary: 급여
SELECT employee_id, 
       COALESCE(phone_number, email, 'No Contact Info') 
       AS contact_info, 
       NULLIF(salary, 0) AS salary
FROM employees;

문제 3

orders 테이블에서 order_total이 NULL이거나 0인 경우 'Pending'으로 표시하고, 그렇지 않으면 해당 금액을 그대로 출력하세요. 또한, 주문 상태가 completed이면 'Shipped', processing이면 'In Progress', 그 외는 'Unknown'으로 표시하세요.

테이블 구조:

  • orders: 주문 정보
    - order_id: 주문 ID
    - order_total: 주문 총액
    - status: 주문 상태 (e.g., completed, processing)
SELECT order_id, 
       COALESCE(NULLIF(order_total, 0), 'Pending') AS total,
       CASE 
         WHEN status = 'completed' THEN 'Shipped'
         WHEN status = 'processing' THEN 'In Progress'
         ELSE 'Unknown'
       END AS order_status
FROM orders;

문제 4

students 테이블에서 각 학생의 성적을 기준으로 학점을 부여하고, 다음 조건에 따라 출력하세요.

테이블 구조:

  • students: 학생 정보
    - student_id: 학생 ID
    - score: 성적
    - is_honors: 우등생 여부 (1이면 우등생)
SELECT student_id, 
       COALESCE(
         CASE 
           WHEN score >= 90 THEN CASE WHEN is_honors = 1 
           THEN 'Honors A' ELSE 'A' END
           WHEN score >= 80 THEN 'B'
           WHEN score >= 70 THEN 'C'
           ELSE 'F'
         END, 'Grade Not Available') AS grade
FROM students;

문제 5

products 테이블에서 제품의 price가 NULL이거나 0이면 'Not Available'로 표시하고, 그 외의 경우에는 가격을 그대로 표시하세요. 그리고 discount가 NULL이거나 0이면 가격을 그대로 출력하고, 그렇지 않으면 할인된 가격(= price - discount)을 표시하세요.

테이블 구조:

  • products: 제품 정보
    - product_id: 제품 ID
    - price: 가격
    - discount: 할인 금액
SELECT product_id, 
       COALESCE(NULLIF(price, 0), 'Not Available') AS price, 
       COALESCE(NULLIF(price - discount, price), price) AS final_price
FROM products;

0개의 댓글