현재 선택한 SQL 과정

SQLP 이론 학습

이론 목록으로 돌아가기

형변환·NULL·조건 함수

TO_CHAR·TO_DATE와 NVL·COALESCE·NULLIF·CASE·DECODE의 결과 타입과 평가 조건을 정리한다.

예상 읽기 6

핵심 요약

TO_CHAR·TO_DATE와 NVL·COALESCE·NULLIF·CASE·DECODE의 결과 타입과 평가 조건을 정리한다.

핵심 질문

  1. 형변환·NULL·조건 함수에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
  2. 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
  3. 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
  4. 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?

학습 목표

  • 명시적 형변환 함수와 NULL 처리 함수의 차이를 설명한다.
  • CASE를 사용해 조건별 값을 안전하게 계산한다.

개념 지도

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
입력 값과 타입 확인 → 함수 적용 → NULL·NLS·형변환 확인 → 결과 타입 검증

핵심 내용

TO_CHAR, TO_NUMBER, TO_DATE는 데이터 타입을 명시적으로 바꾼다. 날짜 문자열은 형식 모델까지 함께 적어 세션 설정의 영향을 줄인다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
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는 등치 비교 중심의 함수다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
CASE WHEN score >= 80 THEN 'PASS' ELSE 'RETRY' END

흔한 오해와 주의점

  • NVL의 두 인자는 반환 타입을 맞추기 위한 변환이 일어날 수 있으므로 타입을 확인한다.
  • NULL끼리의 일반 비교는 TRUE가 아니므로 CASE 조건에서도 IS NULL을 사용한다.
  • 조건 함수로 0 나눗셈을 피할 때 실제 평가 대상과 반환 타입을 함께 점검한다.

문항 풀이 보강: 조건부 집계와 DBMS별 NULL 함수

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
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 Server ISNULL(a,b)는 두 인자 NULL 대체다.
  • 표준 COALESCE는 여러 후보 중 첫 NULL 아닌 값을 고른다.
  • NULLIF(a,b)는 두 값이 같으면 NULL이다.
  • DECODE는 Oracle의 등치 비교 중심 함수이고 CASE는 범위·복합 조건도 표현한다.

문자열 결합에 NULL이 포함될 때의 결과는 DBMS와 함수에 따라 다를 수 있으므로 문제의 환경을 확인한다.

명시적 형변환 예

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
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

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
CASE
  WHEN score >= 90 THEN 'A'
  WHEN score >= 80 THEN 'B'
  ELSE 'C'
END

CASE는 조건을 위에서부터 평가하므로 범위가 겹치지 않게 배치한다. NVL은 두 인수의 타입 변환 규칙 때문에 예상치 못한 변환이 생길 수 있고, COALESCE는 여러 후보에서 첫 non-NULL을 선택한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
-- 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과 데이터 타입 변환 때문에 조건의 의미가 달라지지 않는지 확인한다. 같은 표현을 반복하기보다 계산 단계를 분리해 읽기 쉽게 작성한다.


결과를 검증하는 순서

  1. 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
  2. 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
  3. NULL 비교가 TRUE, FALSE, UNKNOWN 중 무엇인지 구분합니다.
  4. 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
  5. 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.

실무와 시험에서 함께 확인할 항목

  • ORDER BY가 없다면 결과 순서를 가정하지 않습니다.
  • 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
  • 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
  • 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.

마지막 점검

  • 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
  • NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
  • ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.
  • 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.

복습 문제

  1. 여러 후보 중 첫 NULL 아닌 값을 고르는 함수는?
  2. NULLIF(10,10)의 결과는?
  3. 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
  4. NULL이 포함될 때 결과가 달라지는 지점은 어디인가?