Database/SQL

오라클 형변환 알짜만 빼먹기, TO_NUMBER(), CAST(), TO_CHAR(), TO_DATE()

리커니 2019. 7. 24. 13:12
반응형

오라클 형변환 알짜만 빼먹기, TO_NUMBER(), CAST(), TO_CHAR(), TO_DATE()

 

오라클에서도 다른 몇몇 프로그래밍 언어처럼 암시적 형변환을 제공합니다.

하지만 정확한 예측이 어렵기 때문에 반드시 명시적으로 형변환을 해야만 합니다.

 

예를들어 M_CODE 테이블의 CD_ID 컬럼이 VARCHAR2(2 BYTE) 타입이라 할때

 

SELECT *
  FROM M_CODE
 WHERE CD_ID = 10

 

위의 쿼리가 가능한 이유는 아래와같이 암시적 형변환이 일어났기 때문입니다.

 

SELECT *
  FROM M_CODE
 WHERE TO_NUMBER(CD_ID) = 10

 

그래서 불필요한 암시적 형변환이 발생하지 않기 위해 아래와 같이 작성을 해야합니다.

데이터의 양이 많아질 수록 기존 컬럼의 형변환은 많은 리소스를 사용합니다. (속도가 느려집니다..)

 

SELECT *
  FROM M_CODE
 WHERE CD_ID = '10'

 

MYBATIS 와 같은 프래임 워크를 사용하여 SQL에 변수를 매핑할 때도

타입을 잘 설정하여 불필요한 형변환이 일어나지 않도록 주의하도록 합니다.

 

위와같이 문자타입을 숫자타입으로 변경할때는 TO_NUMBER() 함수를 사용합니다.

 

TO_NUMBER(문자타입컬럼)

 

이제 CASE() 함수를 사용하는 형변환에 대해서 알아볼껀데요,

CASE()함수는 데이터 형식을 실시간은로 변환 하는데 사용됩니다.

 

CASE 함수의 문법은

 

CASE(형변환할 컬럼 AS 변환할타입)

 

입니다. 그럼 위에서 예로든 M_CODE 테이블의 CD_ID로 확인을 해보도록 하죠.

 

SELECT CAST(CD_ID AS CHAR(50))
     , LENGTH(CD_ID)
     , LENGTH(CAST(CD_ID AS CHAR(50)))
  FROM M_CODE

 

M_CODE 테이블의 CD_ID의 타입은 VARCHAR2(2) 입니다.

CAST 함수를 통해서 CHAR(50)으로 변경하고 LENGTH를 체크해 보겠습니다.

 

CAST 예제

 

결과를 보시면 LENGTH가 50으로 변경된 것을 확인하실 수 있습니다.

많이 사용되지는 않지만, CAST 함수를 사용하면 타입이 맞지 않아 발생하는 에러를 방지 할 수 있습니다.

 

CAST 함수를 사용할 때 주의 하셔야 될 점도 있습니다.

소수점을 포함하는 숫자 타입 변환 시 만약 기존 자릿수보다 작은 자릿수로 CAST 하게 되면 ROUND(반올림) 되어 처리됩니다. 이점 주의 하시구요.

 

SELECT 123.45678
    , ROUND(123.45678, 2)
    , CAST(123.45678 AS NUMBER(5,2))
  FROM SYS.DUAL

 

CAST 예제2

 

 

 

DATE 타입을 형변환하는 TO_DATE(), TO_CHAR() 함수에 대해서 알아보도록 하겠습니다.

 

DATE 타입을 문자열 파라미터와 비교하게 되면 아래와 같은 에러가 발생하게 됩니다.

 

ORA-01861: 리터럴이 형식 문자열과 일치하지 않음
01861. 00000 - "literal does not match format string"
*Cause: Literals in the input must be the same length as literals in
the format string (with the exception of leading whitespace). If the
"FX" modifier has been toggled on, the literal must match exactly,
with no extra whitespace.
*Action: Correct the format string to match the literal.

 

일치하지 않는 타입을 비교하려고 하니 발생하는 에러인데요, 형변환 함수를 사용하여 타입을 맞춰주면 됩니다.

 

SELECT INS_DT
     , TO_CHAR(INS_DT, 'YYYYMMDDHH24MISS') AS FORMAT_DATE
  FROM G_MSD
 WHERE TO_CHAR(INS_DT, 'YYYYMMDDHH24MISS') BETWEEN '20190724000000' AND '20190724235959'

 

오라클 날짜 표현, 연산, 비교에 대해서는 아래의 Link를 참고하세요.!

 

Link : Oracle 오라클 날짜 표현, 날짜 계산, 날짜 연산

 

Oracle 오라클 날짜 표현, 날짜 계산, 날짜 연산

Oracle 오라클 날짜 표현, 날짜 계산, 날짜 연산 SELECT SYSDATE AS BASIC , TO_CHAR(SYSDATE, 'YYYY.MM.DD') -- 년월일 , TO_CHAR(SYSDATE, 'YYYY.MM.DD HH:MI:SS') -- 년월일 시분초 (12시) , TO_CHAR(SYSDATE,..

aljjabaegi.tistory.com

 

형변환 함수는 오라클 SQL 문 작성 시 빈도수가 높습니다. (CAST는 아니지만..)

위의 함수들을 사용하여 명시적으로 형 변환을 하여 효율적인 SQL문을 작성하도록 합시닷!!

 

 

반응형