BLAKE 와 JAMES 는 SAL + COMM 이 NULL 이지만 SAL + NVL(COMM, 0) 은 급여가 그대로 나온다.
NULL 이 아닌 값(TURNER 의 0 포함)은 바뀌지 않는다.
두 인자의 타입은 맞아야 한다. 숫자 컬럼 COMM 의 대체값으로 문자를 주면 Oracle 이 'NONE' 을 숫자로 바꾸려다 실패한다.
SELECT ENAME, NVL(COMM, 'NONE') FROM EMP WHERE DEPTNO = 10;
SELECT ENAME, NVL(COMM, 'NONE') FROM EMP WHERE DEPTNO = 10 *ERROR at line 1:ORA-01722: unable to convert string value containing 'N' to a number:ORA-03302: (ORA-01722 details) invalid string value: NONE
문자로 보여 주려면 앞쪽을 먼저 문자로 바꾼다: NVL(TO_CHAR(COMM), 'NONE').
SQL Server 에서는 같은 일을 ISNULL(COMM, 0) 으로 한다. Oracle 에서 ISNULL 은 ORA-00904(invalid identifier) 오류다.
SELECT ENAME, SAL, CASE WHEN SAL > 2000 THEN SAL * 1.1 END RAISE FROM EMP WHERE DEPTNO = 10;
ENAME SAL RAISE---------- ---------- ----------CLARK 2450 2695KING 5000 5500MILLER 1300
THEN 과 ELSE 의 결과는 타입이 같아야 한다. 첫 결과가 문자면 나머지도 문자여야 한다.
SELECT CASE 1 WHEN 1 THEN 'A' WHEN 2 THEN 2 END FROM DUAL;
SELECT CASE 1 WHEN 1 THEN 'A' WHEN 2 THEN 2 END FROM DUAL *ERROR at line 1:ORA-00932: expression (2) is of data type NUMBER, which is incompatible with expected data type CHAR
NVL2 : NULL 여부에 따라 두 값 중 하나를 고르는 함수. NULL 이 아니면 두 번째, NULL 이면 세 번째.
NULLIF : 두 값이 같으면 NULL 을, 다르면 첫 값을 돌려주는 함수.
COALESCE : 인자 중 NULL 이 아닌 첫 값을 돌려주는 표준 함수.
simple CASE : 하나의 식을 여러 값과 같은지 비교하는 CASE 형식.
searched CASE : WHEN 마다 조건식을 자유롭게 쓰는 CASE 형식.
DECODE : simple CASE 와 같은 일을 하는 Oracle 전용 함수. NULL 끼리를 같다고 본다.
📝 연습 문제
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
EMP 테이블에서 BLAKE 의 SAL 은 2850, COMM 은 NULL 이다. 다음 SQL 의 결과로 알맞은 것은?
```sql
SELECT NVL2(COMM, SAL + COMM, SAL) FROM EMP WHERE ENAME = 'BLAKE';
```
문제 2
다음 SQL 의 결과로 알맞은 것은?
```sql
SELECT COALESCE(NULL, NULLIF(5, 5), 7, 9) FROM DUAL;
```
문제 3
SAL 이 3000 인 사원에 대해 다음 CASE 식의 결과로 알맞은 것은?
```sql
SELECT CASE WHEN SAL >= 1500 THEN 'MID' WHEN SAL >= 3000 THEN 'HIGH' ELSE 'LOW' END FROM EMP WHERE ENAME = 'SCOTT';
```
문제 4
Oracle 에서 다음 SQL 의 결과로 알맞은 것은?
```sql
SELECT NVL('', 'EMPTY') FROM DUAL;
```
문제 5
DEPTNO 가 30 인 행에 대해 다음 식의 결과로 알맞은 것은?
```sql
SELECT DECODE(DEPTNO, 10, 'A', 20, 'B') FROM EMP WHERE ENAME = 'BLAKE';
```