홈 › SQL 중급 › 05 / 11

조건 로직: CASE·DECODE·IIF

섹션 6진행 0 / 11

2. 핵심 원리

2.1 단순 CASE 와 검색 CASE

CASE 는 두 가지 형태가 있습니다. 단순 CASE 는 하나의 식을 여러 값과 동등 비교하고, 검색 CASE 는 각 분기마다 독립된 조건식을 씁니다.

형태 문법 비교 방식
단순 CASE CASE expr WHEN v1 THEN r1 ... END expr = v1 동등 비교만
검색 CASE CASE WHEN cond1 THEN r1 ... END 조건마다 독립된 불리언 식

단순 CASE 는 부서 코드처럼 정확히 같은 값을 찾아 바꿔치기할 때 짧고 명확합니다. 검색 CASE 는 급여 구간처럼 범위 비교나 여러 컬럼을 조합한 조건이 필요할 때 씁니다.

2.2 ELSE 를 생략하면 NULL

ELSE 를 생략하고 어떤 WHEN 조건에도 걸리지 않으면 결과는 NULL 입니다. 오류 없이 조용히 NULL 이 섞이므로, 그 값을 다시 집계하거나 비교하는 다음 단계에서 예상과 다른 결과가 나올 수 있습니다. 모든 값을 다 받아내고 싶다면 ELSE 를 반드시 넣습니다.

2.3 조건은 위에서부터, 첫 참에서 멈춘다

검색 CASE 의 WHEN 조건은 위에서 아래로 순서대로 평가됩니다. 먼저 참이 되는 조건에서 멈추고 그 뒤 조건은 아예 보지 않으므로, 넓은 조건을 먼저 두면 좁은 조건이 죽습니다. 구간을 나눌 때는 더 좁거나 더 큰 기준부터 위에 두는 순서가 안전합니다.

핵심

CASE 는 조건을 병렬로 검사하지 않습니다. 위에서부터 차례로 검사하다 처음 참이 되는 WHEN 에서 멈추므로, 조건 순서 자체가 결과를 바꿉니다.

2.4 결과 타입은 모든 분기가 호환돼야 한다

CASE 의 모든 THEN 과 ELSE 는 결과 타입이 서로 호환돼야 합니다. 문자열 자리에 숫자를, 숫자 자리에 문자열을 섞으면 DB 가 한쪽을 다른 쪽 타입으로 암시적 변환하려다 실패하거나, 실패하지 않아도 뜻밖의 값으로 바뀔 수 있습니다.

주의

같은 CASE 안에서 문자와 숫자를 섞지 않습니다. 구간별로 반환 타입이 다르면 오류가 나거나, DB 마다 다른 암시적 변환 규칙 때문에 결과가 DB 별로 달라질 수 있습니다.

2.5 DECODE 는 Oracle·Tibero 전용, NULL 처리가 다르다

DECODE 는 Oracle 과 Tibero 에만 있는 함수로, 단순 CASE 와 같은 자리에서 값을 비교해 바꿔치기합니다. 가장 큰 차이는 NULL 처리입니다. DECODE 는 NULL 과 NULL 을 같다고 보고 일치시키지만, 단순 CASE(CASE col WHEN NULL THEN ...)는 = 비교로 동작해 NULL 에 절대 일치하지 않습니다.

핵심

NULL 여부로 분기해야 한다면 단순 CASE 의 WHEN NULL이 아니라 검색 CASE 의 WHEN col IS NULL 을 씁니다. DECODE 만 NULL 을 값처럼 비교할 수 있습니다.

2.6 IF·IIF·CHOOSE — DB 마다 다른 이름의 편의 함수

MySQL 의 IF(), MSSQL 의 IIF·CHOOSE 는 검색 CASE 한 줄을 함수 하나로 줄인 것입니다.

함수 DB 비고
IF(cond, a, b) MySQL 2-way 조건, H2 미지원
IIF(cond, a, b) MSSQL(2012 부터) 2-way 조건, H2 미지원
CHOOSE(i, v1, v2, ...) MSSQL(2012 부터) 순번으로 값 선택, H2 미지원

IF·IIF 는 CASE WHEN cond THEN a ELSE b END 와 동일하고, CHOOSE 는 순번별 분기라 CASE i WHEN 1 THEN v1 WHEN 2 THEN v2 ... END 와 같습니다. 세 함수 모두 이 레슨의 H2 환경에서는 실행되지 않아 4절에서 오류를 직접 확인하고 CASE 로 바꿔 씁니다.