
NULL은 정의되지 않은 값을 의미합니다. 0 또는 공백과는 다른 고유한 의미가 있습니다. NOT NULL 제약 혹은 PRIMARY KEY로 정의하지 않은 컬럼은 모두 NULL 값이 있을 수 있습니다. NULL을 포함하는 연산의 결과 값은 항상 NULL 입니다.
NULL을 포함한 연산의 결과를 NULL이 아닌 값으로 얻고자 할때 NVL/ISNULL 함수를 사용합니다. 주로 숫자관련 연산인 경우 0으로, 문자 관련 연산인 경우 'x' 와 같이 시스템에서 의미없는 문자로 바꾸는 경우가 많습니다. 관계형 데이터베이스에서 NULL을 처리하는 주요 함수는 다음과 같습니다.
NLV(NULL 판단대상, NULL 일때 대체값)
SELECT NLV(NULL, "NVL-OK") AS NVL_TEST
FROM DUAL;
SELECT NLV("NOTNULL", "NVL-OK") AS NVL_TEST
FROM DUAL;
SELECT PLAYER_NAME AS 선수명, NVL(POSITION, "없음") AS 포지션
FROM PLAYER
WHERE TEAM_ID = "K08"
NVL 함수를 활용한 SQL 문장은 CASE 문으로 표현할 수 있습니다.
SELECT PLAYER_NAME AS 선수명,
CASE
WHEN POSITION IS NULL THEN '없음'
ELSE POSITION
END AS 포지션
FROM PLAYER
WHERE TEAM_ID = 'K08'
SELECT ENAME , SAL, COMM, (SAL * 12) + NVL(COMM, 0) AS 연봉
다중행 함수는 입력 값인 전체 건수가 NULL인 경우만 함수의 결과가 NULL 나오고 컬럼 값이 NULL인 레코드는 집계 대상에서 제외됩니다. 예를 들어 100a명 중 10명의 성적이 NULL 일때 이 데이터에 대해 다중행 함수 AVG를 사용하면 성적이 NULL이 아닌 90명에 대해서만 집계합니다.
결과가 공집합일때 NVL/ISNULL 함수 사용
조건에 맞는 데이터가 한 건도 없는 경우 공집합이라고 합니다. 'SELECT 1 FROM DUAL WHERE 1 = 2 '와 같은 조건이 대표적인 공집합을 발생시키는 쿼리입니다. 쿼리의 결과가 공집합의 경우, 그룹함수와 NVL 함수를 같이 사용해서 특정 값이 도출되도록 처리합니다.
-- 집계함수를 인수로 한 NVL/ISNULL 함수를 이용해서 공집합인 경우에도 빈칸이 아닌 9999로 출력하게 한다.
SELECT NVL ( MAX(MGR), 9999) AS MGR
FROM EMP
WHERE ENAME = 'JSC';
NULLIF(EXPR1, EXPR2)
EXPR1이 EXPR2와 같으면 NULL, 같지않으면 EXPR1을 리턴합니다. 특정값을 NULL로 대체하는 경우에 유용합니다.
SELECT ENAME, EMPNO, MGR, NULLIF(MGR,7698) AS NUIF
FROM EMP;
SELECT ENAME, EMPNO, MGR,
CASE
WHEN MGR = 7698 THEN NULL
ELSE MGR
END AS NLIF
FROM EMP;
COALESCE(EXPR1, EXPR2, EXPR3, ....)
COALESCE 함수는 인수의 숫자가 한정돼 있지 않으며, 임의의 개수 EXPR에서 NULL이 아닌 최초의 EXPR을 결과로 도출합니다. 모든 EXPR이 NULL 이면 NULL을 리턴합니다.
SELECT ENAME, COMM, COALESECE(COMM, SAL) AS COAL
FROM FROM;
SELECT ENAME, COMM, SAL,
CASE
WHEN COMM IS NOT NULL THEN COMM
ELSE (
CASE
WHEN SAL IS NOT NULL THEN SAL
ELSE NULL
END
)
END AD COAL
FROM EMP;