문제 상황: 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) 위험 | 단점 거의 없음 |
추천 | 간단한 쿼리나 레거시 코드 호환 시 제한적으로 사용 | 모든 상황에서 기본적으로 사용 권장 |
핵심 요약:
ISNULL
과 COALESCE
의 차이점을 명확히 이해하고, 특히 데이터 타입 잘림(Truncation) 문제를 피하기 위해 ANSI 표준 함수인 COALESCE
를 우선적으로 사용하는 습관을 들이는 것이 더 안정적이고 확장성 있는 코드를 작성하는 길입니다.
'프로그래밍 > 개발자의 SQL 연구소' 카테고리의 다른 글
[MSSQL] DATEADD, DATEDIFF 완벽 정복: 날짜 계산 치트 시트 (1) | 2025.08.20 |
---|---|
[MSSQL] 문자열 분리: STRING\_SPLIT 기본기와 주의점 총정리 (0) | 2025.08.19 |
[MSSQL] CASE WHEN으로 똑똑하게 데이터 집계하기 (매출 구간별 분석) (1) | 2025.08.18 |
[MSSQL] ROW_NUMBER()로 그룹별 Top N 순위 구하기 (실무 예제 3가지) (4) | 2025.08.16 |
[MSSQL] 날짜 포맷 YYYY-MM-DD, 10초 해결과 성능 분석 핵심 가이드 (4) | 2025.08.15 |