본문 바로가기

DB

MySQL 과 Oracle NULL 처리 – IFNULL vs NVL

MySQL과 Oracle은 NULL 값을 다른 값으로 치환하는 함수가 다르며,
동작 방식과 제약 조건도 차이가 있다
NULL 처리 함수는 보고서, 집계, 데이터 표시 등에서 자주 쓰인다


1. MySQL – IFNULL

SELECT IFNULL(name, '없음') FROM user;

동작 원리

  • 첫 번째 인자가 NULL이면 두 번째 인자로 대체
  • NULL이 아니면 원래 값을 반환
  • 두 인자의 데이터 타입이 달라도 자동 형변환이 가능

 예시

-- 1) 문자열 예시
SELECT name, IFNULL(name, '이름없음') AS name_checked
FROM user;

-- 2) 숫자 예시
SELECT age, IFNULL(age, 0) AS age_checked
FROM user;

-- 3) 타입 혼합 가능
SELECT IFNULL(salary, '급여정보 없음') FROM employees;
-- salary가 숫자여도 문자열로 변환 후 반환

2. Oracle – NVL

SELECT NVL(name, '없음') FROM user;

 동작 원리

  • MySQL의 IFNULL과 같은 역할
  • 단, 두 인자의 데이터 타입이 반드시 동일해야 함
  • 숫자 컬럼에 문자열을 넣으려면 형변환 필요

 예시

-- 1) 문자열 예시
SELECT NVL(name, '이름없음') AS name_checked
FROM user;

-- 2) 숫자 예시
SELECT NVL(age, 0) AS age_checked
FROM user;

-- 3) 타입 불일치 → 에러
SELECT NVL(salary, '급여정보 없음') FROM employees;
-- ORA-01722: invalid number (문자열-숫자 혼합 불가)

-- 4) 형변환 후 처리
SELECT NVL(TO_CHAR(salary), '급여정보 없음') FROM employees;

3. 차이점 비교

구분 MySQL – IFNULL Oracle – NVL

기본 기능 NULL → 대체값 반환 NULL → 대체값 반환
타입 규칙 두 인자의 타입 달라도 자동 변환 두 인자의 타입 동일해야 함
문자열/숫자 혼합 가능 불가능 (형변환 필요)
표준 함수 아님 (MySQL 전용) 아님 (Oracle 전용)

4. 실무 활용 팁

  1. 집계 결과 NULL 방지
-- MySQL
SELECT department_id, IFNULL(SUM(salary), 0) FROM employees GROUP BY department_id;

-- Oracle
SELECT department_id, NVL(SUM(salary), 0) FROM employees GROUP BY department_id;
  1. 리포트에 공백 대신 표시
-- MySQL
SELECT IFNULL(phone, '-') FROM customers;

-- Oracle
SELECT NVL(phone, '-') FROM customers;
  1. 타입 혼합 시 Oracle은 TO_CHAR/TO_NUMBER 사용
-- 숫자 + 문자 혼합 출력
SELECT NVL(TO_CHAR(salary), '급여정보 없음') FROM employees;

정리

  • MySQL: IFNULL이 더 자유로움 (자동 형변환 지원)
  • Oracle: NVL은 엄격, 타입 동일해야 함
  • 숫자 ↔ 문자열 변환 시 Oracle은 TO_CHAR, TO_NUMBER를 반드시 사용