CAST 함수
CAST 함수는 한 데이터 유형을 다른 호환 가능한 데이터 유형으로 변환합니다. 예를 들어 문자열을 날짜로 변환하거나 숫자 형식을 문자열로 변환할 수 있습니다. CAST는 런타임 변환을 수행합니다. 즉, 변환을 수행해도 원본 테이블의 값 데이터 형식은 변경되지 않습니다. 쿼리의 컨텍스트에서만 변경됩니다.
CAST 함수는 한 데이터 유형을 다른 데이터 유형으로 변환한다는 점에서 CONVERT 함수와 매우 유사하지만 호출되는 방식이 다릅니다.
CAST 또는 CONVERT 함수를 사용하여 다른 데이터 형식으로 명시적인 변환이 필요한 데이터 형식이 몇 가지 있습니다. 그 밖에 CAST 또는 CONVERT를 사용하지 않고 다른 명령의 일부로서 묵시적으로 변환할 수 있는 데이터 형식들도 있습니다. 형식 호환성 및 변환 섹션을 참조하세요.
구문
한 가지 데이터 형식에서 다른 데이터 형식으로 표현식을 변환할 때는 다음과 같이 두 가지 동등한 구문 형식을 사용할 수 있습니다.
CAST ( expression AS type ) expression :: type
인수
- expression
-
열 이름이나 리터럴 같이 하나 이상의 값으로 평가되는 표현식입니다. null 값을 변환하면 마찬가지로 null이 반환됩니다. 또한 표현식에는 공백이나 빈 문자열이 포함되어서도 안 됩니다.
- type
-
지원되는 데이터 타입 중 한 가지입니다.
반환 타입
CAST는 type 인수에서 지정하는 데이터 형식을 반환합니다.
참고
다음과 같이 문제가 발생할 수 있는 변환을 실행하면 Amazon Redshift가 오류를 반환합니다. 첫째, 정밀도를 떨어뜨리는 DECIMAL 변환입니다.
select 123.456::decimal(2,1);
둘째, 오버플로우를 야기하는 INTEGER 변환입니다.
select 12345678::smallint;
예시
이 안내서에 나오는 예는 대부분 샘플 TICKIT 데이터베이스를 사용합니다. 샘플 데이터 설정에 관한 자세한 내용은 데이터 로드 단원을 참조하세요.
다음에 동등한 2개의 쿼리입니다. 두 쿼리 모두 소수 값을 정수로 변환합니다.
select cast(pricepaid as integer) from sales where salesid=100;
pricepaid ----------- 162 (1 row)
select pricepaid::integer from sales where salesid=100;
pricepaid ----------- 162 (1 row)
다음과 같은 결과가 나옵니다. 실행하는 데 샘플 데이터가 필요하지 않습니다.
select cast(162.00 as integer) as pricepaid;
pricepaid ----------- 162 (1 row)
이 예에서는 각 결과에서 시간이 제거되고 타임스탬프 열의 값이 날짜로 변환됩니다.
select cast(saletime as date), salesid from sales order by salesid limit 10;
saletime | salesid -----------+--------- 2008-02-18 | 1 2008-06-06 | 2 2008-06-06 | 3 2008-06-09 | 4 2008-08-31 | 5 2008-07-16 | 6 2008-06-26 | 7 2008-07-10 | 8 2008-07-22 | 9 2008-08-06 | 10 (10 rows)
이전 예에서 설명한 대로 CAST를 사용하지 않은 경우 결과에 2008-02-18 02:36:48처럼 시간이 포함됩니다.
다음 쿼리는 가변 문자 데이터를 날짜로 캐스팅합니다. 실행하는 데 샘플 데이터가 필요하지 않습니다.
select cast('2008-02-18 02:36:48' as date) as mysaletime;
mysaletime -------------------- 2008-02-18 (1 row)
다음은 날짜 열의 값이 타임스탬프로 변환된 예입니다.
select cast(caldate as timestamp), dateid from date order by dateid limit 10;
caldate | dateid --------------------+-------- 2008-01-01 00:00:00 | 1827 2008-01-02 00:00:00 | 1828 2008-01-03 00:00:00 | 1829 2008-01-04 00:00:00 | 1830 2008-01-05 00:00:00 | 1831 2008-01-06 00:00:00 | 1832 2008-01-07 00:00:00 | 1833 2008-01-08 00:00:00 | 1834 2008-01-09 00:00:00 | 1835 2008-01-10 00:00:00 | 1836 (10 rows)
이전 예와 같은 경우에는 TO_CHAR를 사용하여 출력 형식을 추가로 제어할 수 있습니다.
다음은 정수가 문자열로 변환된 예입니다.
select cast(2008 as char(4));
bpchar -------- 2008
다음은 DECIMAL(6,3) 값이 DECIMAL(4,1) 값으로 변환된 예입니다.
select cast(109.652 as decimal(4,1));
numeric --------- 109.7
이 예에서는 좀 더 복잡한 표현식을 보여줍니다. 다음은 SALES 테이블의 PRICEPAID 열(DECIMAL(8,2) 열)을 DECIMAL(38,2) 열로 변환하고, 값을 100000000000000000000과 곱합니다.
select salesid, pricepaid::decimal(38,2)*100000000000000000000 as value from sales where salesid<10 order by salesid;
salesid | value ---------+---------------------------- 1 | 72800000000000000000000.00 2 | 7600000000000000000000.00 3 | 35000000000000000000000.00 4 | 17500000000000000000000.00 5 | 15400000000000000000000.00 6 | 39400000000000000000000.00 7 | 78800000000000000000000.00 8 | 19700000000000000000000.00 9 | 59100000000000000000000.00 (9 rows)
참고
GEOMETRY
데이터 형식에 대해 CAST 또는 CONVERT 작업을 수행하여 다른 데이터 형식으로 변경할 수 없습니다. 그러나 GEOMETRY
인수를 허용하는 함수에 대한 입력으로 EWKB(Extended Well-Known Binary) 형식으로 문자열 리터럴의 16진수 표현을 제공할 수 있습니다. 예를 들어, ST_AsText
함수는 GEOMETRY
데이터 형식을 사용합니다.
SELECT ST_AsText('01010000000000000000001C400000000000002040');
st_astext ------------ POINT(7 8)
GEOMETRY
데이터 형식을 명시적으로 지정할 수도 있습니다.
SELECT ST_AsText('010100000000000000000014400000000000001840'::geometry);
st_astext ------------ POINT(5 6)