본문 바로가기

Oracle/Oracle SQL

Database SQL_Sigle-Row Function_형 변환 함수

Step 2. Single-Row Function! 

- Sub : 형 변환 함수

 

형변환이란 무엇일꽈? 부터 봐야겠지요. C나 Java나 모두 자료형 문자형 등의 '형' 들이 등장합니다.

형은 무엇일까요? case라고 생각하면 편하지 않을까 싶습니다. 세상에는 참 많은 케이스들이 있죠.

 

 

핸드폰 케이스만 하더라도 색, 기종, 회사, 디자인에 따라 각각 다릅니다. 이것을 각자 형이라고 하면 얼마나 다양한지 알겠죠?ㅎ

핸드폰 외에도 수많은 케이스들이 있습니다. 이것들을 모두 다 형이라고 해볼께요 ㅎ

그 많은 형들중에 우리는 지금 SQL의 형을 살펴볼텐데요. SQL중에서도 DBMS에 따라 형이 다 다릅니다.

핸드폰 케이스도 색에따라 다르듯이 SQL의 형도 DBMS에 따라 다릅니다.

그 중에 저는 ORACLE이라는 회사의 DBMS를 이용하는 것이고 그것을 살펴볼겁니다.

 

그냥 가볍게 JAVA, C 등의 언어를 생각해보시면 숫자형, 문자형 등이 있죠? SQL도 마찬가지입니다.

데이터 타입

 설 명

CHAR(n)

 고정길이의 문자를 저장. 최대 2000Bytes

VARCHAR2(n)

 가변길이의 문자를 저장. 최대 4000Bytes

NUMBER(p,s)

 숫자 값을 저장. p는 전체자리수로 1~38자리

 s는 소수점 이하자리수로 -84 ~ 127까지 가능

DATE

 총 7Byte로 BC4712년 1월 1일부터 AD 9999년 12월 31일 까지 가능

LONG

 가변길이의 문자를 저장. 최대 2GB

CLOB

 가변길이의 문자를 저장. 최대 4GB

BLOB

 가변길이의 바이너리 데이터를 저장. 최대 4GB

RAW(n)

 원시 이진 데이터로 최대 2000Bytes

LONG RAW(n)

 원시 이진 데이터로 최대 2GB

BFILE

 외부 파일에 저장된 데이터로 최대 4GB

 

이렇게 보면 좀 많아보이는데 주로 쓰는 것은 CHAR, VARCHAR2, NUMBER, DATE 이정도가 많이 쓰입니다. 원래대로라면 좀더 많습니다

 

 

이렇게가 ORACLE에서의 DATA RULE이지만 위에서 말했듯이 많이 쓰는 것은 한정되어 있으므로 이런게 있구나라고만 생각하면됩니다.

 

또한 구분을 지으면, 문자형, 숫자형, 날짜형 이렇게 형이 잡히는데요. 이것을 서로서로 변환시키는 것이 형변환입니다.

 

Oracle에서의 형변환은 묵시적 형변환명시적 형변환이 있습니다.

묵시적이라는 것은 눈감고 자동으로 해준다는 아량넓은 기능입니다.

그냥 일반적으로 SELECT 1+'1' FROM DUAL; 하면 어떻게 될까요? 에러일까요? 이같은 경우 똑똑한 ORACLE이 2라고 출력해줍니다.

하지만 SELECT 1+'A' FROM DUAL; 하면 에러입니다. 뒤에가 A라는 문자이기 때문이죠.

묵시적 형변환의 경우에는 심각한 성능저하가 올 수 있으므로 웬만하면 명시적 형변환을 해주는 것이 좋습니다.

 

그럼 명시적 형변환은?? 수동입니다. 어떻게 수동일까요? 지금은 함수파트죠?ㅎ 함수를 써서 수동으로 바꿔주는 것이죠. 어떤함수??

 

 

이러한 함수들을 써서요. TO_CHAR, TO_NUMBER, TO_DATE 이렇게 세개의 함수를 제일 많이 씁니다. 형들은 많지만 이번에는 이렇게 세개의 대표적인 형변환 함수를 알아보도록 하죠!!ㅎ

 

TO_CHAR는 위에서 볼 수 있듯이 숫자 -> 문자, 날짜 -> 문자로 바꾸는데 쓰입니다. 또한 문자를 문자로 바꾸는 것 또한 가능합니다.

TO_CHAR(character), TO_CHAR(number), TO_CHAR(datetime) 총 세가지를 제대로 살펴보도록 하겠습니다.

 

TO_CHAR(character)의 경우 먼저 알아보겠습니다. 이 함수의 경우에는 character부분에 CLOB, NCHAR, NVARCHAR2, NCLOB 등이 들어갑니다. 형에 N이 붙은건 Native라는 뜻으로 해석이 되고 유니코드를 말합니다. U라고 하면 좀더 쉬웠을텐데..ㅎ 저만 그런가요 ㅎ

이 경우 형변환이 일어나는데 저 네가지 문자형들이 VARCHAR2라는 문자형으로 항상 변환이 됩니다.

한마디로 말하자면 TO_CHAR(character)는 CLOB, NCLOB, NVARCHAR2, NCHAR -> VARCHAR2로 변환되는 것입니다.

 

TO_CHAR(datetime)의 경우는 날짜를 문자로 바꾸는 것이지요. 날짜는 그냥 보기엔 문자같기도, 숫자같기도 하지만 날짜는 날짜!ㅎ

문법적으로 보면 TO_CHAR(date(interval) [, fmt [, nlsparam]])으로 되어있습니다.

어려움없이 보면 문자로 바꿀 날짜가 맨처음 오겠죠. 그대신 interval이라는 것이 등장하는데요. oracle data type중 하나로 기간을 재는 타입입니다. 기억만 하셔도 될것같습니다. fmt는 YYYY, DD, MM 같은 FORMAT이구요. NLS는 좀있다가 보게 될것이지만 NULL일 경우의 어떻게 표현 할 것인지를 말하는 파라미터입니다. 이렇게 보면 또 어렵죠..ㅎㅎ 직접 실습을 해봅시당 ㅎㅎ

 

 

 

맨처음은 역시 연도부터!ㅎ TO_CHAR를 네개를 연달아 썼습니다. 한번 FMT에 따른 결과물을 볼까요?

YYYY : 연도를 숫자 네개로 표현. 위에서 보면 2013이라고 나오죠?ㅎ 숫자가 아닌 문자입니다.

RRRR : Y2K라는 바이러스에 대해 알고 계신가요? 2000년이 되면서 동시 다발적으로 세계에 재앙이 시작된다고 생각했습니다. 2000년이 되자마자 증권가를 덮쳤었던 바이러스입니다. 날짜 바이러스라고 아시면 될것같습니다. 그 바이러스때문에 2000년 이후에는 RRRR이라고 새로운 표기법이 등장했습니다.

YY : 연도를 끝자리 두개만 출력하는 표기법입니다.

YEAR : 연도를 영어로 하면 풀네임 YEAR죠? 영어로 알파벳 풀네임으로 나타내는 표기법입니다.

 

월별로 한번 가보도록 하겠습니다.

 

 

MM : 역시 기본표기법으로 쓰이는 것으로 숫자 두자리로 표현하는 법입니다.

MON : 월을 영문자 세자리로 표현하는 법입니다.

MONTH : 월을 영문자 풀네임으로 표현하는 법입니다.

 

일별로 가볼까욤 ㅎ

 

 

DD : 일을 숫자 두자리로 표현합니다.

DAY : 요일에 해당하는 영문자 풀네임을 표현합니다.

DDTH : 숫자에 TH식으로 몇번째 날인지를 표현합니다. 1, 2, 3은 각각 FIRST, SECOND, THIRD로 표현하기에 ST, ND, RD로 표현!ㅎ

 

이 외에도 시간은 HH, HH24, 분은 MI, 초는 SS로 표현합니다 ㅎ 이전에도 말했던 기억이 나는데..ㅎ

TO_CHAR(datetime)을 이걸로 끝내고 TO_CHAR(number)를 보겠습니다.

 

TO_CHAR(number)는 숫자를 문자로 형변환 하는 것이죠 ㅎ 여기서도 약간의 룰이 있답니다. 룰이 참 많은 아이..ㅎ

 종류

 의미

 사용 예

 결 과

 9

 9 하나당 자리수 하나 의미

 TO_CHAR(1234,'99999')

 1234

 0

 빈자리를 0으로 표시

 TO_CHAR(1234,'099999') 

 001234

 $

 $ 표시를 붙여서 표시

 TO_CHAR(1234,'$9999')

 $1234

 .

 소수점 이하를 표시

 TO_CHAR(1234,'9999.99')

 1234.00

 ,

 천 단위 구분 기호 표시

 TO_CHAR(1234,'9,999')

 1,234

 

이런거 기억해서 쓰면 참 편리하겠죠?ㅎ 사용예와 결과를 위에서 보여드렸는데 별다른 거 없어서 넘어가겠습니다 ㅎ

 

TO_CHAR는 이제 모두 다 설명을 했습니다! 이제 TO_NUMBER, TO_DATE인데 이건 별로 다를게 없네요..ㅎㅎ

 

TO_NUMBER는 그냥 TO_NUMBER('character', fmt, nvlparam) 문법인데요. character안에 숫자를 넣어주면 됩니다. 문자를 넣어주면 오류가..ㅎ NUMBER의 FMT는 위에서 보이는 TO_CHAR(number)의 fmt와 동일하고 쁠라스가 되기도 합니다. 메뉴얼을 보면 상세히ㅎ

 

 

기본적으로는 이렇게 쓰인다는 것!!ㅎ

 

TO_DATE는 TO_DATE('DATE', 'fmt', nvlparam) 입니다. FMT는 기본적으로 위에서 다 살펴보았습니다. 몇몇가지가 더 있지만 필요에 따라서 메뉴얼을 보고 하시면 될듯 합니다. 다 다룰까 했지만 지금은 책에 있는 것부터 다하려고 마음먹어서..ㅎ 나중에 시간이 나면 FMT도 한번 전체적으로 다루도록 하겠습니다.

 

 

제 욕심이 너무 과했던 건가요..ㅎ 형식이 긴데 다 표현이 안되는 슬픈 현실..ㅠㅠ DATE는 이렇게만 표현되나봐요.. 허허..

여기까지가 형변환 함수였습니다. 어렵지는 않은 것들 ㅎㅎ.. 다음 SQL 포스팅에서는 일반함수를 다루겠습니다.

실질적으로 많이 다루는 함수들이기 때문에 매우매우 중요하다는거!ㅎㅎ 다음 포스팅때 뵙겠습니다 ㅎ 빠른 시일 내에~ㅎ