CS
[SQLD] 일반 함수
2026년 02월 13일 16:59
SQLD 2과목 – 일반함수
일반 함수
1. NVL
- NULL 값을 다른 값으로 치환
- 대상 값과 치환 값은 서로 동일한 데이터 타입
NVL(대상, 치환값)
SELECT ENAME, COMM, NVL(COMM, 100) AS NEW_COMM
FROM EMP
WHERE DEPTNO = 30;
-- COMM 값이 NULL인 경우에는 100으로 치환
-- NULL이 아닌 경우에는 원래 값 유지
2. NVL2
- 대상 값이 NULL인지 여부에 따라 서로 다른 값 반환
NVL2(대상, 그외치환값, 널치환값)
특징
- 대상 값이 NULL이 아니면 첫번째 인수인 그외치환값 반환
- 대상 값이 NULL이면 두번째 인수인 널치환값 반환
- 반환되는 두 값은 서로 동일한 데이터 타입
SELECT ENAME, COMM, NVL2(COMM, '있음', '없음') AS 치환결과
FROM EMP
WHERE DEPTNO = 30;
-- COMM 값이 NULL인 경우에 없음으로 치환
-- COMM 값이 NULL이 아닌 경우에 있음으로 치환
3. COALESCE
- NULL 값을 치환
- NVL과 달리 두 개 이상의 인수 지정 가능
COALESCE(대상1, 대상2 [, 대상3] [, ...] )
특징
- 나열된 값 중에서 가장 먼저 등장하는 NULL이 아닌 값을 반환
- 모든 인수는 서로 호환 가능한 데이터 타입
SELECT STUDNO, SCORE1, SCORE2, SCORE3,
COALESCE(SCORE1, SCORE2, SCORE3) AS RESULT
FROM T_SCORE;
-- 나열된 값 중 가장 먼저 발견되는 NULL이 아닌 값 출력
4. NULLIF
- 두 값을 비교하여 동일한 경우 NULL 반환
NULLIF(대상, 값)
특징
- 두 값이 서로 같으면 NULL, 다르면 첫번째 값 반환
SELECT ENAME, SAL, COMM,
NULLIF(COMM, 100) AS 결과1,
NULLIF(COMM, 500) AS 결과2
FROM EMP;
-- 결과1의 경우 COMM의 값이 100과 일치하는 행을 NULL로 변환
-- 결과2의 경우 COMM의 값이 500과 일치하는 행을 NULL로 변환
5. ISNULL
- NULL값을 다른 값으로 치환
- SQL Server에서만 제공
ISNULL(대상, 치환값)
특징
- 대상 값이 NULL이면 치환값, NULL이 아니면 원래 값 반환
SELECT ENAME, SAL, COMM,
ISNULL(COMM, 100)
FROM EMP
-- COMM의 값이 NULL인 경우에 100으로 치환
6. DECODE
- 조건에 따라 서로 다른 값을 반환
- Oracle에서 제공
DECODE(대상1, 값1, 결과1 [, 값2] [, 결과2] [, ... 기본값])
특징
- 대상값이 값1과 일치하면 결과1 반환
- 대상값이 값2와 일치하면 결과2 반환
- 기본값은 모든 조건에 일치하지 않을 경우 반환 (생략 시 NULL 반환)
SELECT DEPTNO,
DECODE(DEPTNO, 10, '인사부', 20, '재무부')
FROM EMP;
-- 부서번호가 10인 경우 인사부 반환
-- 부서번호가 20인 경우 재무부 반환
-- 그 외의 경우 NULL 반환
7. CASE문
- 조건에 따라 서로 다른 결과 반환
- 반드시 END 키워드로 마무리
- 조건과 그에 대응하는 치환값 여러 개 전달 가능
CASE WHEN 조건1 THEN 결과1
[WHEN 조건2 THEN 결과2]
[....]
[ELSE 기본값]
END [AS 컬럼별칭]
축약형
CASE 대상 WHEN 값1 THEN 결과1
[WHEN 값2 THEN 결과2]
[....]
[ELSE 기본값]
END [AS 컬럼별칭]
특징
- ELSE 절 생략 시 NULL이 반환
- 모든 조건의 대상이 같고 항상 동등 비교 조건일 경우 축약형 사용 가능
- 축약형 문법에서는 WHERE과 THEN 사이에 상수 값만 배치 가능
- 축약형 문법에서 값과 결과의 데이터 타입이 일치하지 않으면 에러
SELECT SAL,
CASE WHEN SAL < 2000 THEN 'C'
WHEN SAL < 3000 THEN 'B'
ELSE 'A'
END AS SAL_GRADE
FROM EMP;
SELECT DEPTNO,
CASE DEPTNO WHEN 10 THEN '인사부'
WHEN 20 THEN '총무부'
WHEN 30 THEN '재무부'
ELSE '기타'
END AS DNAME1,
CASE WHEN DEPTNO = 10 THEN '인사부'
WHEN DEPTNO = 20 THEN '총무부'
WHEN DEPTNO = 30 THEN '재무부'
ELSE '기타'
END AS DNAME2
FROM EMP;
