데이터 형식 변환 함수


가장 일반적으로 사용되는 데이터 형식 변환은 CAST()와 CONVERT() 함수를 사용한다.

둘은 형식만 다를 뿐 거의 비슷한 기능을 한다. 그리고 SQL Server2012부터는 데이터 형식 변환과 관련된

TRY_CONVERT(), PARSE(), TRY_PARSE() 세 개 함수가 추가되었다.

TRY_CONVERT()는 CONVERT()와 같지만 변환에 실패할 경우에 Null 값을 반환한다.

그리고 PARSE()와 TRY_PARSE() 함수는 문자열에서 날짜/시간 및 숫자 형식으로 변환하는 경우에 사용된다.

TRY_PARSE()도 TRY()와 같지만 변환에 실패할 경우에 Null 값을 반환한다.


특히, CAST()와 CONVERT()는 자주 사용되는 함수이므로 사용법을 잘 알아두도록 하자.


CAST ( expression AS 데이터형식 [ (길이) ] )

CONVERT ( 데이터형식 [ (길이) ] , expression [ , 스타일 ] )

TRY_CONVERT ( 데이터형식 [ (길이) ] , expression [ , 스타일 ] )

PARSE (문자열 AS 데이터형식)

TRY_PARSE (문자열 AS 데이터형식)


사용 예를 보면 좀 더 쉽게 이해가 갈 것이다. 다음은 테스트DB sqlDB의 구매 테이블(buyTbl)에서 평균 구매 개수를 구하는 쿼리문이다.





SELECT AVG(amount) AS [평균구매개수] FROM buyTbl ;




그런데 결과는 2가 나왔다. 그 이유는 수량(amount)의 데이터 형식이 정수형(INT)이므로, 정수형과 정수형의 계산 결과는 정수형이 

되기 떄문이다.


이것을 다음과 같이 CAST() 함수나 CONVERT(), TRY_CONVERT() 함수를 사용할 수 있다.


SELECT AVG ( CAST(amount AS FLOAT) ) AS [평균구매개수] FROM buyTbl ;

또는

SELECT AVG ( CONVERT(FLOAT, amount) ) AS [평균구매개수] FROM buyTbl ;

또는

SELECT AVG ( TRY_CONVERT(FLOAT, amount) ) AS [평균구매개수] FROM buyTbl ;




이번에는 단가/수령의 결과를 살펴보자, 둘 다 int 형이므로 결과도 int 형이다.


SELECT price, amount, price/amount AS [단가/수량] FROM buyTbl ;




결과 중 두 개(5행, 8행)은 정수이므로 정확한 값이 아니다. 이를 CAST() 함수나 CONVERT() 또는 TRY_CONVERT() 함수를 사용해서

실수로 변환해 보자. 그리고 출력되는 값을 소수점 아래 2자리까지만 출력해 보자.


SELECT price, amount, CAST(CAST(price AS FLOAT) / amount AS DECIMAL(10,2))

AS [단가/수량] FROM buyTbl ;




특별히 문자열을 변환할 경우에는 PARSE()나 TRY_PARSE()를 사용할 수 있다.


SELECT PARSE('2012년 12월 12일' AS DATE) ;





PARSE()가 실패할 경우에는 오류가 발생되지만, TRY_PARSE()는 정상적으로 실행되고 Null 값을 반환한다.


SELECT PARSE('123.45' AS INT) ;

SELECT TRY_PARSE('123.45' AS INT) ;


앞의 첫문장은 쿼리에서 오류가 발생되지만, 두 번째 문장은 오류는 발생하지 않고 Null 을 반환한다.

TRY_CONVERT() 및 TRY_PARSE()는 프로그래밍에서 오류가 나도 계속 진행하고자 할 경우에 유용하게 사용될 수 있다.



암시적인 형 변환


형 변환 방식에는 명시적인 변환과 암시적인 변환, 두 가지가 있다. 명시적인 변환이란 CAST() 또는 CONVERT() 함수를

이용해서 데이터 형식을 변환하는 것을 말한다. 암시적인 변환이란 CAST() 나 CONVERT() 함수를 사용하지 않고 형이 

변환되는 것을 말한다.


DECLARE @myVar1 char(3) ;

SET @myVar1 = '100' ;

SELECT @myVar1 + '200' ;   -- 문자와 문자를 더함 (정상)

SELECT @myVar1 + 200 ;     -- 문자와 정수를 더함 (정상: 정수로 암시적 형 변환)

SELECT @myVar1 + 200.0 ;   -- 문자와 실수를 더함 (정상: 실수로 암시적 형 변환)




첫 번째 결과인 '문자+문자=문자'의 정상적인 결과가 나왔다. 그런데 두 번째와 세 번째는 '문자+숫자'라서 더할 수가 없지만,

암시적인 변환이 일어나서 '문자+정수=정수', '문자+실수=실수'라는 결과가 나온 것이다. 모두 정상적인 결과이다.

이것을 직접 명시적인 변환으로 고치면 다음과 같다


DECLARE @myVar1 char(3) ;

SET @myVar 1 = '100' ;

SELECT @myVar1 + '200' ;   -- 문자와 문자를 더함 (정상)

SELECT CAST(@myVar1 AS INT) + 200 ;   -- 정수로 변환 후 연산

SELECT CAST(@myVar1 AS DECIMAL (5,1) + 200.0 ;   -- 실수로 변환 후 연산


이처럼 암시적인 변환과 명시적인 변환 중에서 어느 것이 더 편리한가? 마치 암시적인 변환이 코딩량을 줄여줄 수 있는 것처럼 보일 수도 있지만, 

조금 불편하더라도 명시적인 변환을 사용하는 것을 권장한다. 암시적인 변환을 믿고 사용하게 될 경우에는 약간의 착오로 결과가 엉뚱하게 나오는

사고(?)가 발생할 소지가 항상 있다.


그 외에 형 변환을 할 때 주의할 사항은 숫자에서 문자로 변환할 때 문자의 자릿수를 잘 고려해야 한다는 점이다.


DECLARE @myVar2 DECIMAL (10,5) ;

SET @myVar2 = 10.12345 ;

SELECT CAST (@myVar2 AS NCHAR(5)) ;





이 오류는 10.12345를 문자로 변환하게 되면 8글자로 변환되므로, 문자형 8자리 이상이 필요해서 나오는 오류이다.

NCHAR(5)를 NCHAR(8) 이상으로 수정한 후에 사용해야 한다. 또, 한 가지는 실수를 정수로 변환할 때 자릿수가 잘릴 수 있다는 점을 고려해야 한다.


DECLARE @myVar3 DECIMAL (10,5) ;

SET @myVar3 = 10.12345 ;

SELECT CAST (@myVar3 AS INT) ;


DECLARE @myVar4 DECIMAL (10,5) ;

SET @myVar4 = 10.12345 ;

SELECT CAST (@myVar4 AS DECIMAL (10,2)) ;





두 결과는 모두 오류는 아니지만 첫 번째는 결과가 10으로, 두 번째는 결과가 10.12로 자릿수가 잘리는 점을 유의해야 합니다.



+ Recent posts