데이터 형 변환이 일어나는 예

2015. 10. 25. 21:50

쿼리를 작성할 때 사실 잘 의식하지는 못하는 부분이지만, 오라클이 query를 수행하는 과정에서 형 변환은 자주, 끊임없이 일어나고 있다. 이채남 저 '오라클 실습'에서 소개한 예제를 여기에 정리하고자 한다.


형변환 사례 1) CONCAT 또는 합성연산자 ||의 사용 시


select emp_id || emp_name from temp;

CONCAT또는 합성연산자는 두개 이상의 문자열을 하나의 문자열로 묶어주는 함수이다.

emp_id가 number type이기 때문에, 이때 오라클은 자동으로 number --> 문자(char? varchar2?)로 형변환을 시켜준다. 즉 위의 쿼리는 다음과 같이 처리가 되게 된다.

(1) 형변환(숫자 to 문자) --> (2)문자열 합성


형변환 사례 2) number type에 문자열 함수를 사용할 경우

위의 사례보다 더 중요하게 생각되는 사례 인데, 예를 들어 다음 쿼리를 보자.


select emp_id, emp_name

from temp

where substr(emp_id,1,4) + 1 = 1998;

emp_id의 첫번째 4자리에 1을 더한 값이 1998인 사원의 사번과 이름을 출력하는 쿼리인데, 문제는 emp_id는 number type인데 substr은 문자열 함수라는 것이다.

따라서 오라클은 위의 쿼리를 수행하기 위해 다음과 같이 형변환을 수행한다.


(1)형변환(숫자 to 문자) -->            (2) substr함수 수행 -->  (3)형변환 (문자 to 숫자) --> (4) 연산

19970101(숫자) --> 19970101(문자)  -->   1997(문자)  -->  1997(숫자)     --> +1 연산 --> 1998(숫자)


두번의 형변환이 일어났는데, 두번째 형변환은 당연히 +1이라는 연산을 수행해주기 위해 일어난 것이다. 비교 대상인 값인 =1998은 숫자로 쓰인 것이므로 세번째 형변환은 일어나지 않는다. 만약 쿼리를 다음과 같이 썻다면, 세번째 형 변환도 일어날 것이다.


select emp_id, emp_name

from temp

where substr(emp_id,1,4) + 1 = '1998';


정리해보니 사실 사례 1과 2는 같은 사례였구나..

이 외에도 형변환의 사례를 찾는다면 이 포스팅을 계속 업데이트 하고 싶은 바람이다.

곰돌곰둘 Oracle_DB_Unix admin/미분류