형변환·NULL·조건 함수
TO_CHAR·TO_DATE와 NVL·COALESCE·NULLIF·CASE·DECODE의 결과 타입과 평가 조건을 정리한다.
핵심 요약
TO_CHAR·TO_DATE와 NVL·COALESCE·NULLIF·CASE·DECODE의 결과 타입과 평가 조건을 정리한다.
핵심 질문
- 형변환·NULL·조건 함수에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
- 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
- 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
- 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?
학습 목표
- 명시적 형변환 함수와 NULL 처리 함수의 차이를 설명한다.
- CASE를 사용해 조건별 값을 안전하게 계산한다.
개념 지도
입력 값과 타입 확인 → 함수 적용 → NULL·NLS·형변환 확인 → 결과 타입 검증
핵심 내용
TO_CHAR, TO_NUMBER, TO_DATE는 데이터 타입을 명시적으로 바꾼다. 날짜 문자열은 형식 모델까지 함께 적어 세션 설정의 영향을 줄인다.
TO_DATE('2026-07-22', 'YYYY-MM-DD')
TO_CHAR(order_dt, 'YYYY-MM')
NULL 관련 함수는 목적이 다르다.
| 함수 | 의미 |
|---|---|
NVL(a,b) | a가 NULL이면 b |
NVL2(a,b,c) | a가 NULL이 아니면 b, 아니면 c |
NULLIF(a,b) | a=b이면 NULL, 아니면 a |
COALESCE(a,b,c) | 처음 만나는 NULL이 아닌 값 |
CASE는 표준 SQL의 조건 표현식이며 단순 CASE와 검색 CASE가 있다. Oracle의 DECODE는 등치 비교 중심의 함수다.
CASE WHEN score >= 80 THEN 'PASS' ELSE 'RETRY' END
흔한 오해와 주의점
- NVL의 두 인자는 반환 타입을 맞추기 위한 변환이 일어날 수 있으므로 타입을 확인한다.
- NULL끼리의 일반 비교는 TRUE가 아니므로 CASE 조건에서도
IS NULL을 사용한다. - 조건 함수로 0 나눗셈을 피할 때 실제 평가 대상과 반환 타입을 함께 점검한다.
문항 풀이 보강: 조건부 집계와 DBMS별 NULL 함수
SELECT team_id,
SUM(CASE WHEN position = 'FW' THEN 1 ELSE 0 END) fw,
SUM(CASE WHEN position = 'MF' THEN 1 ELSE 0 END) mf,
COUNT(*) total
FROM player
GROUP BY team_id;
CASE에서 조건이 거짓이고 ELSE가 없으면 NULL을 반환한다. SUM은 NULL을 제외하므로 해당 포지션이 한 건도 없는 팀은 SUM 결과가 NULL이 될 수 있다. ELSE 0을 쓰거나 바깥에서 NVL(amount, 0)·SQL Server ISNULL(amount, 0)로 0을 만든다.
COALESCE(c1,c2,c3)는 왼쪽부터 첫 NULL 아닌 값을 행마다 고른다. 예를 들어 (1,2,3), (NULL,2,3), (NULL,NULL,3)의 결과는 1, 2, 3이며 합은 6이다.
이름이 비슷한 함수 구분
- Oracle
NVL(a,b), SQL ServerISNULL(a,b)는 두 인자 NULL 대체다. - 표준
COALESCE는 여러 후보 중 첫 NULL 아닌 값을 고른다. NULLIF(a,b)는 두 값이 같으면 NULL이다.DECODE는 Oracle의 등치 비교 중심 함수이고CASE는 범위·복합 조건도 표현한다.
문자열 결합에 NULL이 포함될 때의 결과는 DBMS와 함수에 따라 다를 수 있으므로 문제의 환경을 확인한다.
명시적 형변환 예
SELECT TO_CHAR(order_date, 'YYYY-MM-DD') AS ymd,
TO_NUMBER(:amount_text, '999999D99',
'NLS_NUMERIC_CHARACTERS=''.,''') AS amount
FROM orders;
Format과 NLS를 명시하지 않으면 Session 환경에 따라 결과가 달라질 수 있다. 저장·조인 Key에는 표시용 문자열보다 원본 DATE·NUMBER 타입을 유지한다.
NVL·COALESCE·CASE
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END
CASE는 조건을 위에서부터 평가하므로 범위가 겹치지 않게 배치한다. NVL은 두 인수의 타입 변환 규칙 때문에 예상치 못한 변환이 생길 수 있고, COALESCE는 여러 후보에서 첫 non-NULL을 선택한다.
-- NULL과 0을 같은 업무값으로 볼 때만 사용
NVL(discount_amount, 0)
NULL 안전 비교
두 Nullable Column을 같다고 볼 때는 a=b OR (a IS NULL AND b IS NULL)처럼 의미를 명시한다. 단순 NVL(a, sentinel)=NVL(b,sentinel)은 sentinel이 실제 값과 충돌할 수 있다.
조건 함수 작성 원칙
WHERE에서 CASE·NVL·TO_CHAR를 사용할 때는 NULL과 데이터 타입 변환 때문에 조건의 의미가 달라지지 않는지 확인한다. 같은 표현을 반복하기보다 계산 단계를 분리해 읽기 쉽게 작성한다.
결과를 검증하는 순서
- 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
- 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
- NULL 비교가
TRUE,FALSE,UNKNOWN중 무엇인지 구분합니다. - 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
- 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.
실무와 시험에서 함께 확인할 항목
ORDER BY가 없다면 결과 순서를 가정하지 않습니다.- 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
- 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
- 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.
마지막 점검
- 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
- NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.- 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.
복습 문제
- 여러 후보 중 첫 NULL 아닌 값을 고르는 함수는?
NULLIF(10,10)의 결과는?- 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
- NULL이 포함될 때 결과가 달라지는 지점은 어디인가?