2 분 소요

MySQL의 조건문과 제어 흐름 함수는 쿼리 내에서 조건에 따라 다른 값을 반환하고 논리 흐름을 제어하는 핵심 도구다. 이 글에서는 IF, IFNULL, NULLIF, CASE, COALESCE의 문법과 실전 활용 패턴을 정리한다. 문법과 동작 설명은 MySQL 8.4 Reference Manual을 기준으로 확인했다.1

MySQL의 조건문 및 제어 흐름 함수 정리

주요 조건문 및 제어 흐름 함수:

  • IF: 단순한 조건문을 처리하며, 조건에 따라 다른 값을 반환합니다.
  • IFNULL: 값이 NULL일 때, 지정된 기본 값을 반환합니다.
  • NULLIF: 두 값이 같으면 NULL을 반환하고, 다르면 첫 번째 값을 반환합니다.
  • CASE: 다중 조건문을 처리하며, 여러 조건에 따라 다른 값을 반환합니다.
  • COALESCE: 여러 인자 중 첫 번째 NULL이 아닌 값을 반환합니다.

1. IF 함수

  • IF() 함수는 단순한 조건문을 처리하는 함수입니다.
  • IF는 주어진 조건이 참일 경우와 거짓일 경우 각각의 값을 반환합니다.

  • 문법:
    • condition: 평가할 조건
    • value_if_true: 조건이 참일 때 반환할 값
    • value_if_false: 조건이 거짓일 때 반환할 값
IF(condition, value_if_true, value_if_false)
  • 예시:
# 설명: 직원의 `salary`가 5000보다 크면 `'High'`, 작거나 같으면 `'Low'`를 반환합니다.
SELECT employee_name, 
       IF(salary > 5000, 'High', 'Low') AS salary_level
FROM Employees;

2. IFNULL() 함수

  • IFNULL() 함수는 NULL 값 처리에 사용됩니다.
  • NULL 값이 있을 경우 대신 반환할 값을 지정할 수 있습니다.
  • 문법:
    • expression: 평가할 값
    • value_if_null: expression이 NULL일 때 반환할 값
IFNULL(expression, value_if_null)
  • 예시:
# 설명: `discount` 값이 **NULL**이면 **0**을 반환하고, 그렇지 않으면 원래 값을 반환합니다.
SELECT product_name, 
       IFNULL(discount, 0) AS discount
FROM Products;

3. NULLIF 함수

  • NULLIF() 함수는 두 개의 값이 동일할 때 NULL을 반환합니다.
  • 서로 다른 값이면 첫 번째 값을 그대로 반환합니다.
  • 문법:
    • expression1: 비교할 첫 번째 값
    • expression2: 비교할 두 번째 값
NULLIF(expression1, expression2)
  • 예시:
# 설명: `delivery_time`이 `'00:00:00'`과 같으면 **NULL**을 반환하고, 그렇지 않으면 원래 값을 반환합니다.
SELECT order_id, 
       NULLIF(delivery_time, '00:00:00') AS delivery_time
FROM Orders;

4. CASE 표현식

  • CASE는 여러 조건을 검사하여 조건에 맞는 값을 반환하는 다중 조건문입니다.
  • 이는 IF 함수보다 복잡한 조건을 처리하는 데 유용합니다.
  • 문법:

CASE WHEN 방식:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ELSE result_default
END

CASE 표현식 방식:

CASE expression
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ELSE result_default
END
  • 예시: CASE WHEN 방식
# 설명: `salary`가 7000보다 크면 `'A'`, 5000보다 크면 `'B'`, 그렇지 않으면 `'C'`를 반환합니다.
SELECT employee_name,
       CASE
           WHEN salary > 7000 THEN 'A'
           WHEN salary > 5000 THEN 'B'
           ELSE 'C'
       END AS salary_grade
FROM Employees;
  • 예시: CASE 표현식 방식
# 설명: `department_id`가 1이면 `'HR'`, 2이면 `'Engineering'`, 그 외에는 `'Other'`를 반환합니다.
SELECT employee_name,
       CASE department_id
           WHEN 1 THEN 'HR'
           WHEN 2 THEN 'Engineering'
           ELSE 'Other'
       END AS department_name
FROM Employees;

5. COALESCE() 함수

  • COALESCE() 함수는 여러 인자 중 NULL이 아닌 첫 번째 값을 반환하는 함수입니다.
  • 이 함수는 여러 열 중 값이 있는 첫 번째 값을 반환할 때 유용합니다.
  • 문법:
# `expression1, expression2, ..., expressionN`: NULL 여부를 확인할 여러 값을 나열합니다.
COALESCE(expression1, expression2, ..., expressionN)
  • 예시:
# 설명: `phone_number`가 NULL이면 `mobile_number`를 반환하고, 그마저도 NULL이면 `'No contact'`을 반환합니다.
SELECT employee_id,
       COALESCE(phone_number, mobile_number, 'No contact') AS contact_info
FROM Employees;

주의할 점과 한계

IF, IFNULL, NULLIF, CASE, COALESCE는 문법이 단순한 대신 반환 타입과 평가 방식에 제약이 있다. 공식 문서에 명시된 범위에서만 정리하면 다음과 같다.

  • NULLIF()는 첫 인자를 두 번 평가할 수 있다: 두 인자가 다르면 expr1을 두 번 평가하므로, 부작용이 있거나 비용이 큰 표현을 인자로 넣는 것은 피한다.1
  • 반환 타입은 인자 타입의 집계 결과다: IFNULL(), COALESCE(), CASE는 결과 타입을 인자 타입들의 집계로 결정한다. 숫자와 문자열을 섞으면 VARCHAR 등 의도와 다른 타입이 되는데, 임시 테이블에 저장할 때 이 차이가 드러난다. (IFNULL(1, 'test')의 결과 타입이 VARBINARY로 잡히는 것이 문서화된 예다.)12
  • NULL 비교에 =를 쓸 수 없다: NULL과의 산술 비교는 항상 NULL이므로, NULLIF(x, NULL)은 참이 되는 조건이 없어 NULL 대신 x를 그대로 반환한다. NULL 여부는 IS NULL/IS NOT NULL로 판정한다.3
  • 콜레이션 불일치로 거부될 수 있다: 이 함수들에 시스템 변수를 인자로 넘기면 Illegal mix of collations 오류로 쿼리가 거부될 수 있으며, 이 경우 CAST로 문자셋과 콜레이션을 맞춰야 한다.1

References

댓글남기기