Darren's Devlog

[불친절한SQL] 기초쿼리, 널 관련 함수 본문

SQL

[불친절한SQL] 기초쿼리, 널 관련 함수

Darren Gwon 2022. 12. 3. 16:54
반응형

○ 널 관련 함수

NULL을 처리하는 함수다.

 

NVL 함수

expr1이 널이 아니면 expr1, 널이면 expr2를 반환한다.

NVL(expr1, expr2)
SELECT NVL(1, 2) AS c1, NVL (NULL, 2) AS c2 FROM DUAL;

 

SELECT ename, sal, comm, sal + comm AS c1, sal + NVL(comm, 0) AS c2 FROM emp;

 

NVL2 함수

expr1이 널이 아니면 expr2, 널이면 expr3를 반환한다.

삼항 연산자와 유사하다고 느껴진다.

NVL2(expr1, expr2, expr3)
SELECT NVL2(1, 2, 3) AS c1, NVL2(NULL, 2, 3) AS c2 FROM DUAL;

 

SELECT ename, sal, comm, sal + (sal * NVL2(comm, 0.1, 0.2)) AS c1 FROM emp;

 

COALESCE 함수

NULL이 아닌 첫 번째 expr을 반환한다. 

SELECT COALESCE(1, 2, 3)       AS c1, COALESCE(NULL, 2, 3) AS c2
     , COALESCE(NULL, NULL, 3) AS c3
  FROM DUAL;

 

NVL, NVL2 함수는 모든 인수를 평가한다. 이로 인해 에러나 부하가 발생할 수 있다.

아래에서 NVL 함수를 사용한 쿼리는 에러가 발생했다. 평가할 필요가 없는 1/0을 평가 했기 때문이다.

COALESCE 함수를 사용한 쿼리는 에러가 발생하지 않는다.

--SELECT NVL(1, 1/0) AS c1 from DUAL; --에러 ORA-01476: 제수가 0 입니다
SELECT COALESCE (1, 1/0) AS c1 FROM DUAL;
--SELECT NVL2(1, 2, 1/0) AS c1 from DUAL; --에러 ORA-01476: 제수가 0 입니다
SELECT DECODE(1, NULL, 1/0, 2) AS c1 FROM DUAL;
SELECT CASE WHEN 1 IS NULL THEN 1/0 ELSE 2 END AS c1 FROM DUAL;

 

NULLIF 함수

expr1과 expr2가 다르면 expr1을 반환하고 다르면 NULL을 반환한다.

NULLIF(expr1, expr2)

 

SELECT NULLIF(1, 1) AS c1, NULLIF(1, 2) AS c2 FROM DUAL;

반응형
Comments