NULL 처리
값이 없는 상태인 NULL을 조건에서 검색하는 방법(IS NULL)과, 계산이나 출력에서 NULL을 다른 값으로 바꾸는 NVL, NVL2, COALESCE
#핵심 요약
NULL은 데이터가 없는 상태이고, 알 수 없는 값(unknown)임
NULL은 =로 비교할 수 없고 IS NULL, IS NOT NULL로 검색함
NULL이 들어간 산술식의 결과는 NULL임
계산 전에 NVL, NVL2, COALESCE로 바꿈
#개념과 동작 원리
NULL은 NOT NULL이나 PRIMARY KEY 제약이 없는 어떤 데이터 타입의 컬럼에도 올 수 있음
값을 모르거나 의미가 없을 때 씀
숫자 0과는 다름
Oracle은 길이 0인 문자 값을 NULL로 처리함
다만 앞으로도 그렇다는 보장이 없으니 빈 문자열을 NULL과 같은 것으로 다루지 말라고 권함
IS NULL, IS NOT NULL 외의 조건에서 결과가 NULL 값에 좌우되면 결과는 UNKNOWN임
NULL은 어떤 값과도, 다른 NULL과도 같거나 다르지 않음
예외로 DECODE는 두 NULL을 같다고 봄
WHERE 절의 조건이 UNKNOWN이면 그 행은 나오지 않음NOT FALSE는 TRUE지만 NOT UNKNOWN은 UNKNOWN임
| 조건 | a의 값 | 결과 |
|---|---|---|
a IS NULL |
NULL | TRUE |
a IS NOT NULL |
NULL | FALSE |
a = NULL |
10 또는 NULL | UNKNOWN |
a != NULL |
10 또는 NULL | UNKNOWN |
a = 10 |
NULL | UNKNOWN |
함수:
| 함수 | 동작 |
|---|---|
NVL(expr, 대체값) |
expr이 NULL이면 대체값 |
NVL2(expr, 값1, 값2) |
expr이 NULL이 아니면 값1, NULL이면 값2 |
COALESCE(expr1, expr2,...) |
실습에서는 COALESCE(comm, 0)을 NVL처럼 썼음PostgreSQL에서 NVL 대신 씀 |
NULL 검색과 함께 사용하는 비교, 논리 조건은 WHERE와 조건 연산자에서 다룸
#필수 명령어 또는 SQL
#NULL 검색
SELECT ename, comm
FROM emp
WHERE comm IS NULL;
SELECT ename, comm
FROM emp
WHERE comm IS NOT NULL;결과 해석: 개별 실행 출력은 기재 없음
#NULL을 다른 값으로
SELECT ename, sal, comm, sal + NVL(comm, 0)
FROM emp;
SELECT ename, sal, comm, NVL2(comm, sal + comm, sal)
FROM emp;
SELECT ename, sal, COALESCE(comm, 0), sal + COALESCE(comm, 0) AS "이번달 월급"
FROM emp;결과 해석: 세 문장 모두 커미션이 NULL인 사원의 월급+커미션을 월급으로 보여 줌NVL 없이 sal + comm만 쓰면 그 사원은 NULL이 됨
숫자 컬럼을 문자로 바꿔 출력하려면 대체값의 타입을 맞춤
SELECT ename, NVL(TO_CHAR(comm), 'no comm')
FROM emp;SELECT ename, COALESCE(TO_CHAR(comm, 'FM9999'), 'no comm')
FROM emp;결과 해석: 개별 실행 출력은 기재 없음
#사용 조건과 주의사항
NVL의 두 인수 타입이 맞지 않을 때의 변환 규칙은 확인 불가
실습에서는 숫자 컬럼에 문자 대체값을 줄 때 TO_CHAR로 먼저 바꿨음