Oracle NVL과 COALESCE 차이점 및 사용법 (NULL 처리 함수 비교)

Oracle NVL과 COALESCE 차이점 및 사용법 (NULL 처리 함수 비교)

Oracle에서 데이터를 조회하다 보면 NULL 값을 다른 값으로 대체해야 하는 경우가 자주 있습니다.

이럴 때 가장 많이 사용하는 함수가 NVL과 COALESCE입니다.

두 함수 모두 NULL을 다른 값으로 변경하는 역할을 하지만, 사용할 수 있는 인자의 개수와 동작 방식에는 차이가 있습니다.

이번 글에서는 Oracle NVL과 COALESCE의 차이점과 각각 언제 사용하는 것이 좋은지 예제와 함께 정리해보겠습니다.


NVL이란?

NVL은 값이 NULL인 경우 지정한 다른 값으로 변경하는 Oracle 함수입니다.

기본 문법은 다음과 같습니다.

NVL(값, 대체값)

예를 들어 BONUS가 NULL이면 0으로 출력하려면 다음과 같이 사용할 수 있습니다.

SELECT
    EMPNO,
    NVL(BONUS, 0) AS BONUS
FROM EMP;

결과

EMPNOBONUS
10011000
10020
1003500

COALESCE란?

COALESCE는 여러 개의 값 중 NULL이 아닌 첫 번째 값을 반환하는 함수입니다.

기본 문법은 다음과 같습니다.

COALESCE(값1, 값2, 값3, ...)

예를 들어 휴대폰 번호가 없으면 집 전화번호를, 그것도 없으면 회사 번호를 출력하려면 다음과 같이 사용할 수 있습니다.

SELECT
    COALESCE(MOBILE_NO, HOME_NO, OFFICE_NO, '정보 없음') AS PHONE
FROM MEMBER;

동작 순서는 다음과 같습니다.

  • MOBILE_NO가 있으면 MOBILE_NO 반환
  • 없으면 HOME_NO 반환
  • HOME_NO도 없으면 OFFICE_NO 반환
  • 셋 다 없으면 ‘정보 없음’ 반환

NVL과 COALESCE 차이

가장 큰 차이는 인자의 개수입니다.

구분NVLCOALESCE
인자 개수2개2개 이상
NULL 처리가능가능
여러 값 비교불가능가능
ANSI SQL 표준❌✅

NVL은 두 개의 값만 비교할 수 있지만, COALESCE는 첫 번째 NULL이 아닌 값을 전달할 수 있습니다.


사용 예제 비교

NVL

SELECT
    NVL(COMMISSION, 0)
FROM EMP;

COMMISSION이 NULL이면 0을 반환합니다.


COALESCE

SELECT
     COALESCE(MOBILE_NO, HOME_NO, OFFICE_NO, '정보 없음') AS PHONE
FROM MEMBER;

휴대폰 번호가 없으면 집 전화번호를 사용하고, 집 전화번호도 없으면 사무실 전화번호를 사용하고, 셋 다 없으면 ‘정보 없음’을 출력합니다.

같은 데이터를 비교해 보기

두 개의 값만 비교하는 경우에는 NVL과 COALESCE의 결과가 동일합니다.

SELECT
    EMPNO,
    NVL(BONUS, 0) AS NVL_RESULT,
    COALESCE(BONUS, 0) AS COALESCE_RESULT
FROM EMP;
EMPNONVL_RESULTCOALESCE_RESULT
100110001000
100200
1003500500

위 예제처럼 두 개의 값만 비교하는 경우에는 결과가 동일합니다.

하지만 COALESCE는 세 개 이상의 값을 순서대로 비교할 수 있다는 점이 가장 큰 차이입니다.


언제 NVL을 사용할까?

다음처럼 NULL을 하나의 값으로만 변경하면 될 경우에는 NVL이 간단합니다.

NVL(SALARY, 0)

하나의 컬럼에 대해서만 NULL을 다른 값으로 변경하면 되는 경우에는 NVL이 가장 간단하고 가독성이 좋습니다.


언제 COALESCE를 사용할까?

여러 컬럼을 순서대로 확인하여 NULL이 아닌 값을 찾고 싶을 때 적합합니다.

예를 들어

  • 휴대폰 번호
  • 집 전화번호
  • 회사 전화번호

중 하나라도 있으면 출력해야 하는 경우 COALESCE를 사용하는 것이 편리합니다.

여러 후보 값 중 사용할 값을 선택해야 하는 경우에는 COALESCE가 훨씬 유용합니다.


어떤 함수를 사용하는 것이 좋을까?

두 함수 모두 NULL을 처리할 수 있지만 용도가 조금 다릅니다.

  • 단순히 하나의 값을 다른 값으로 바꾸는 경우에는 NVL
  • 여러 값 중 처음으로 NULL이 아닌 값을 찾는 경우에는 COALESCE

를 사용하는 것이 일반적입니다.

또한 COALESCE는 ANSI SQL 표준 함수이므로 Oracle뿐 아니라 PostgreSQL, SQL Server, MySQL 등 다른 데이터베이스에서도 사용할 수 있다는 장점이 있습니다.


요약

Oracle의 NVL과 COALESCE는 모두 NULL을 처리하는 함수입니다.

NVL은 두 개의 값만 비교하여 NULL을 대체하는 함수이고, COALESCE는 여러 개의 값 중 NULL이 아닌 첫 번째 값을 반환합니다.

Oracle에서 NULL 값을 처리해야 한다면 단순한 NULL 대체에는 NVL, 여러 값 중 첫 번째 NULL이 아닌 값을 찾아야 한다면 COALESCE를 사용하는 것이 가장 적합합니다.


자주 묻는 질문(FAQ)

Q. NVL과 COALESCE는 같은 함수인가요?

비슷한 역할을 하지만 완전히 같지는 않습니다. NVL은 두 개의 값만 비교할 수 있고, COALESCE는 여러 개의 값을 순서대로 확인할 수 있습니다.


Q. Oracle에서는 NVL과 COALESCE 중 무엇을 더 많이 사용하나요?

둘 다 많이 사용됩니다. 단순한 NULL 처리에는 NVL을 사용하는 경우가 많고, 여러 값을 비교해야 하는 경우에는 COALESCE를 사용하는 것이 더 적합합니다.


Q. COALESCE는 Oracle에서만 사용할 수 있나요?

아니요. COALESCE는 ANSI SQL 표준 함수이므로 Oracle 외에도 PostgreSQL, SQL Server, MySQL 등 다양한 데이터베이스에서 사용할 수 있습니다.


Q. NVL을 COALESCE로 바꿔도 되나요?

두 개의 값만 비교하는 경우에는 대부분 동일하게 사용할 수 있습니다. 다만 COALESCE는 여러 개의 값을 받을 수 있다는 차이가 있으므로 상황에 맞게 선택하는 것이 좋습니다.

함께 보면 좋은 Oracle 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다