본문 바로가기

database

oracle - 형변환의 종류, 숫자포맷, NULL처리 함수

19.11.26. 형변환의 종류, 숫자포맷, NULL처리 함수

데이터베이스 구현

2019-12-02 00:09:37

 


형 변환

1. 명시적 형 변환

-TO_NUMBER

-TO_DATE

-TO_CHAR

 

2. 묵시적 형 변환

-VARCHAR2 or CHAR -> NUMBER

-VARCHAR2 or CHAR -> DATE

-NUMBER -> VARCHAR2

-DATE -> VARCHAR2

 

*묵시적 형 변환이 일어나지 않도록 데이터 타입을 잘 적어야 한다.

 

--

SELECT *

FROM emp

WHERE empno = '7369'

  => 여기서 묵시적 형변환이 일어났음. empno 의 값들은 NUMBER 타입인데,

       문자열을 검색했는데도 정상적으로 조회가 된다.

 

SELECT *

FROM emp

WHERE empno = TO_NUMBER('7369');

 => 이렇게 하면 문자열을 숫자로 형 변환한 거니까 되긴 하지만, 제대로 되는 건지는 알 수 없다.

       이때에 EXPLAIN PLAN FOR 를 알고자 하는 쿼리의 위에 적고,

       설명을 출력하려면 SELECT * FROM TABLE(dbms_xpla.display); 를  실행함으로

       어떻게 실행한 것인지 계획을 알 수 있다.

       

EXPLAIN PLAN FOR

SELECT *

FROM emp

WHERE empno = TO_NUMBER('7369');

SELECT *

FROM TABLE(dbms_xplan.display);

  => 이렇게 실행시킨다

*실행 계획은 위에서 아래로 읽으며, 자식 모드가 있으면 자식 모드부터 읽는다.

 

--묵시적 형 변환 중 특히 날짜를 조심해야 한다.

SELECT *

FROM emp

WHERE hiredate >= '1981/06/01';

 => 묵시적 형 변환이 일어남. DATE 타입의 묵시적 형 변환은 사용을 권하지 않는다.

       우리나라와 미국만 비교해봐도 연, 월, 일을 표기하는 순서가 다르기 때문이다. 

--

SELECT *
FROM emp
WHERE hiredate >= TO_DATE ('1981/06/01', 'YY/MM/DD')

  => 이렇게 하는 것을 권함.

 

*YY대신, RR 을 사용할 수도 있다.

YY는 두 자리의 연도를 1900년도로 읽음.

RR 은 두자리의 연도를 50 이상이면 1900년도로, 50 미만이면 2000년대로 본다.

네 자릿수 연도일 때는 상관없음. 

*숫자->문자열, 문자->숫자    로의 형변환이 많이 쓰이지 않는데, 이유는 DB까지 오지 않고,

어플리케이션 레벨에서 제어해주는 것이 있기 때문이다. 국제화, 로케일...?

*숫자 표기 1000000 --> 1,000,000.00 (반점이 찍힌 것은 문자임.)

              독일의 경우 1.000.000,00 으로 점과 반점을 바꿔 사용함.

 

▶ 숫자 포맷

숫자 표현 : 9

자리 맞춤을 위한 0 표시 : 0

화폐단위 : L

1000자리 구분 : , 

소수점 : .

 

-숫자를 문자열로 바꿀 때 : TO_CHAR(숫자, '포맷')

숫자 포맷이 길어질 경우 숫자 자리를 충분히 표현해야 한다.

--

SELECT ename, sal, TO_CHAR (sal, '9,999L')

FROM emp;

  => sal 을 우리나라 돈으로 표기함. 반점을 찍고, 원화 표기를 했다.

--

SELECT TO_CHAR(100000000000000, '999,999,999,999,999,999,999')

FROM dual;

  => 100000000000000 와 같이 큰 숫자의 경우 포맷에 9를 많이 써줘야 함.

 

▶NULL 처리 함수 : NVL, NVL2, NULIF, COALESCE

1. NVL (exprl1, expr2) 

: 함수 인자가 두 개. expr1 이 NULL 이면 expr2 를 반환.

 expr1이 NULL이 아니면, expr1 을 반환.

 NULL 일 때에 대체할 값을 인자로 가지고 있는 것.

 

2. NVL2 (expr1, expr2, expr3)

: expr IS NOT NULL = expr2 반환.

 expr IS NULL = expr3 반환.

 NVL2 는 expr1 을 반환하지 못한다.

 

3. NULLIF(expr1, expr2)

: expr1 = expr2  -> NULL 반환.

 expr 1 != expr2 -> expr1 반환.

 NULLIF 는 NULL 값을 만들어냄.

 

4. COALESCE(expr1, expr2, expr3......)

: 인자 중에 첫 번째로 등장하는 NULL이 아닌 expr N 을 반환.

 

 

 

* TO_DATE 는 연산 불가능. TO_CHAR 는 숫자와 연산하면 무조건 숫자로 바뀜!