본문 바로가기

프로그래밍/개발자의 SQL 연구소

[MSSQL] ISNULL vs COALESCE, 차이점과 올바른 사용법 총정리

문제 상황: NULL 값을 다른 값으로 안전하게 바꾸고 싶을 때

데이터를 다루다 보면 값이 비어있는 NULL을 반드시 마주치게 됩니다. NULL은 0이나 공백('')과는 다른, '알 수 없는 값'이라는 특수한 상태이기 때문에 연산(+, -)이나 집계(SUM, AVG) 시 예상치 못한 결과를 초래할 수 있습니다.

 

이때 NULL을 특정 기본값(Default)으로 바꿔주는 함수가 필요한데, MSSQL에서는 대표적으로 ISNULL()COALESCE()를 사용합니다. 둘은 비슷해 보이지만, 결정적인 차이점이 있어 상황에 맞게 사용하지 않으면 오류가 발생하거나 성능 저하를 일으킬 수 있습니다.

 

  • ISNULL(표현식, 대체값): 인수를 딱 2개만 받습니다. 첫 번째 표현식이 NULL이면 두 번째 대체값을 반환합니다. 데이터 타입이 다른 경우, 첫 번째 표현식의 타입을 따라가므로 주의가 필요합니다.
  • COALESCE(표현식 1, 표현식 2,...): 인수를 여러 개 받을 수 있습니다. 왼쪽부터 차례대로 확인하여 처음으로 NULL이 아닌 값을 반환합니다. 데이터 타입 우선순위에 따라 결과 타입이 결정되므로 더 유연하고 안전합니다.

결론: 특별한 이유가 없다면, ANSI 표준 함수이며 더 유연하고 안전한 COALESCE를 사용하는 것이 좋습니다.

-- ISNULL 예시
SELECT ISNULL(NULL, '대체값'); -- 결과: '대체값'

-- COALESCE 예시
SELECT COALESCE(NULL, NULL, '첫 NULL이 아닌 값', '이건 무시됨'); -- 결과: '첫 NULL이 아닌 값'

 


 

ISNULL vs. COALESCE: 결정적 차이 3가지

1. 인수(Argument)의 개수

  • ISNULL: ISNULL(check_expression, replacement_value) 형태로 오직 2개의 인수만 가질 수 있습니다.
  • COALESCE: COALESCE(expression, [,... n]) 형태로 2개 이상의 여러 인수를 가질 수 있습니다. 여러 컬럼을 연달아 체크해야 할 때 매우 유용합니다.
-- 예: 닉네임이 없으면 이름, 이름도 없으면 '익명'으로 표시
DECLARE @nickname NVARCHAR(50) = NULL;
DECLARE @username NVARCHAR(50) = NULL;

-- COALESCE 사용 (코드가 간결하고 직관적)
SELECT COALESCE(@nickname, @username, '익명'); -- 결과: '익명'

-- ISNULL 사용 (함수를 여러 번 중첩해야 해서 복잡함)
SELECT ISNULL(@nickname, ISNULL(@username, '익명')); -- 결과: '익명'

2. 결과의 데이터 타입

이것이 실무에서 가장 중요한 차이점입니다. 데이터 타입 처리 방식이 달라 예기치 않은 오류를 발생시킬 수 있습니다.

  • ISNULL: 결과의 데이터 타입을 첫 번째 인수의 데이터 타입에 맞추려고 합니다.
  • COALESCE: 인수의 데이터 타입 우선순위에 따라 결과 타입을 결정합니다. (예: INT보다 VARCHAR가, VARCHAR보다 DATETIME이 더 높음)

치명적인 오류 발생 예시:

DECLARE @value VARCHAR(10) = NULL;

-- ISNULL 사용 시 오류 발생
-- 첫 번째 인수 @value가 VARCHAR(10)이므로,
-- 대체값 '이것은 열 글자가 넘는 긴 문자열'을 VARCHAR(10)에 담으려다 실패
SELECT ISNULL(@value, '이것은 열 글자가 넘는 긴 문자열');
-- 결과: 오류! string or binary data would be truncated.

-- COALESCE 사용 시 정상 작동
-- 두 인수의 데이터 타입 중 우선순위가 더 높은 쪽으로 자동 변환되므로,
-- 긴 문자열을 담을 수 있는 타입으로 결과가 결정됨
SELECT COALESCE(@value, '이것은 열 글자가 넘는 긴 문자열');
-- 결과: '이것은 열 글자가 넘는 긴 문자열'

3. 표준 준수 여부

  • ISNULL: MSSQL(T-SQL)에서만 사용되는 비표준 함수입니다.
  • COALESCE: ANSI SQL 표준 함수로, MSSQL뿐만 아니라 Oracle, MySQL, PostgreSQL 등 대부분의 데이터베이스에서 동일하게 작동합니다. 다른 DB와 호환성을 고려해야 한다면 COALESCE를 사용하는 것이 좋습니다.

성능 차이는 있을까?

과거에는 ISNULL이 아주 미세하게 더 빠르다는 의견도 있었지만, 최신 버전의 SQL Server 쿼리 옵티마이저는 두 함수의 실행 계획을 거의 동일하게 처리합니다. 따라서 성능 차이는 무시할 수 있는 수준이며, 성능보다는 함수의 유연성과 안정성을 기준으로 선택하는 것이 올바른 접근입니다.

 


최종 결론: 언제 무엇을 써야 할까?

구분 ISNULL COALESCE
장점 함수 이름이 조금 더 짧음 ANSI 표준, 여러 인수 처리 가능, 데이터 타입 처리 안전
단점 비표준, 인수 2개 제한, 데이터 타입 잘림(Truncation) 위험 단점 거의 없음
추천 간단한 쿼리나 레거시 코드 호환 시 제한적으로 사용 모든 상황에서 기본적으로 사용 권장

 

핵심 요약:

ISNULLCOALESCE의 차이점을 명확히 이해하고, 특히 데이터 타입 잘림(Truncation) 문제를 피하기 위해 ANSI 표준 함수인 COALESCE를 우선적으로 사용하는 습관을 들이는 것이 더 안정적이고 확장성 있는 코드를 작성하는 길입니다.

Recent Posts
Popular Posts