CAST, `::`
CAST, ::
한 데이터 타입의 값을 다른 데이터 타입으로 변환하는 함수예요. :: 연산자는 CAST의 대체 구문을 제공해요. 캐스트가 불가능하면 오류가 발생해요.
출처: 공식 문서
본문
한 데이터 타입의 값을 다른 데이터 타입으로 변환합니다. CAST의 의미는 해당하는 TO_datatype 변환 함수의 의미와 같습니다. 캐스트가 불가능하면 오류가 발생합니다. 자세한 내용은 개별 TO_datatype 변환 함수를 참고하세요. 데이터 타입 변환과 TO_datatype 변환 함수에 대한 자세한 내용은 Data type conversion을 참고하세요.
:: 연산자는 CAST의 대체 구문을 제공합니다.
참고 (See also): TRY_CAST
구문 (Syntax)
CAST( <source_expr> AS <target_data_type> )
[ RENAME FIELDS | ADD FIELDS ]
<source_expr> :: <target_data_type>
인자 (Arguments)
source_expr
다른 데이터 타입으로 변환할 임의의 지원 데이터 타입의 표현식.
target_data_type
표현식을 변환할 데이터 타입. 데이터 타입이 지레시전·스케일 같은(숫자/십진수의 경우) 추가 속성을 지원하면 그 속성을 포함할 수 있습니다.
RENAME FIELDS
구조화된 OBJECT의 경우, OBJECT가 다른 키-값 쌍을 사용하도록 변경하고 싶다고 지정합니다. 원본 객체의 값은 나타나는 순서대로 새 키-값 쌍에 복사됩니다. 예제는 "Example: Changing the key names in an OBJECT value"를 참고하세요.
ADD FIELDS
구조화된 OBJECT의 경우, OBJECT에 키-값 쌍을 추가하고 싶다고 지정합니다. 예제는 "Example: Adding keys to an OBJECT value"를 참고하세요. 새로 추가된 키의 값은 NULL로 설정됩니다. 이 키들에 값을 할당하려면 OBJECT_INSERT 함수를 호출하세요.
사용 참고 (Usage notes)
- 스케일이 입력 값을 담기에 충분하지 않으면 함수는 값을 반올림합니다.
- 정밀도가 입력 값을 담기에 충분하지 않으면 함수는 오류를 발생시킵니다.
- Parquet 파일로 데이터를 언로드할 때 숫자 컬럼을 정수 데이터 타입의 형태로 명시적으로 캐스팅하면, Parquet 파일에서 이 컬럼들의 데이터 타입은 INT입니다. 자세한 내용은 Explicitly convert numeric columns to Parquet data types를 참고하세요.
- 값이 텍스트 문자열 데이터 타입(예: VARCHAR, STRING)으로 캐스팅될 때 콜레이션 지정은 유지되지 않습니다. 값을 캐스팅할 때 콜레이션 지정을 포함할 수 있습니다(예:
CAST(myvalue AS VARCHAR) COLLATE 'en-ai'). ::대체 구문을 사용할 때는RENAME FIELDS나ADD FIELDS인자를 지정할 수 없습니다.
예제 (Examples)
CAST 예제는 다음 테이블의 데이터를 사용합니다:
CREATE OR REPLACE TABLE test_data_type_conversion (
varchar_value VARCHAR,
number_value NUMBER(5, 4),
timestamp_value TIMESTAMP);
INSERT INTO test_data_type_conversion VALUES (
'9.8765',
1.2345,
'2024-05-09 14:32:29.135 -0700');
SELECT * FROM test_data_type_conversion;
+---------------+--------------+-------------------------+
| VARCHAR_VALUE | NUMBER_VALUE | TIMESTAMP_VALUE |
|---------------+--------------+-------------------------|
| 9.8765 | 1.2345 | 2024-05-09 14:32:29.135 |
+---------------+--------------+-------------------------+
예제는 SYSTEM$TYPEOF 함수를 사용해 변환된 값의 데이터 타입을 보여줍니다.
문자열을 지정된 스케일(2)의 숫자로 변환합니다:
SELECT CAST(varchar_value AS NUMBER(5,2)) AS varchar_to_number1,
SYSTEM$TYPEOF(varchar_to_number1) AS data_type
FROM test_data_type_conversion;
+--------------------+------------------+
| VARCHAR_TO_NUMBER1 | DATA_TYPE |
|--------------------+------------------|
| 9.88 | NUMBER(5,2)[SB4] |
+--------------------+------------------+
같은 문자열을 :: 표기법을 사용해 스케일 5의 숫자로 변환합니다:
SELECT varchar_value::NUMBER(6,5) AS varchar_to_number2,
SYSTEM$TYPEOF(varchar_to_number2) AS data_type
FROM test_data_type_conversion;
+--------------------+------------------+
| VARCHAR_TO_NUMBER2 | DATA_TYPE |
|--------------------+------------------|
| 9.87650 | NUMBER(6,5)[SB4] |
+--------------------+------------------+
숫자를 정수로 변환합니다. 정수의 경우 precision과 scale을 지정할 수 없으므로 기본값은 항상 NUMBER(38, 0)입니다.
SELECT CAST(number_value AS INTEGER) AS number_to_integer,
SYSTEM$TYPEOF(number_to_integer) AS data_type
FROM test_data_type_conversion;
+-------------------+-------------------+
| NUMBER_TO_INTEGER | DATA_TYPE |
|-------------------+-------------------|
| 1 | NUMBER(38,0)[SB1] |
+-------------------+-------------------+
숫자를 문자열로 변환합니다:
SELECT CAST(number_value AS VARCHAR) AS number_to_varchar,
SYSTEM$TYPEOF(number_to_varchar) AS data_type
FROM test_data_type_conversion;
+-------------------+--------------+
| NUMBER_TO_VARCHAR | DATA_TYPE |
|-------------------+--------------|
| 1.2345 | VARCHAR[LOB] |
+-------------------+--------------+
문자열을 지정된 길이의 VARCHAR 값으로 변환합니다:
SELECT varchar_value,
SYSTEM$TYPEOF(varchar_value) AS data_type_source,
CAST(varchar_value AS VARCHAR(9)) AS converted_varchar,
SYSTEM$TYPEOF(converted_varchar) AS data_type_converted
FROM test_data_type_conversion;
+---------------+------------------------+-------------------+---------------------+
| VARCHAR_VALUE | DATA_TYPE_SOURCE | CONVERTED_VARCHAR | DATA_TYPE_CONVERTED |
|---------------+------------------------+-------------------+---------------------|
| 9.8765 | VARCHAR(16777216)[LOB] | 9.8765 | VARCHAR(9)[LOB] |
+---------------+------------------------+-------------------+---------------------+
값을 지정된 길이의 VARCHAR 타입으로 캐스팅하는데 값이 그 길이를 초과하면 오류가 반환됩니다:
SELECT CAST(varchar_value AS VARCHAR(4))
FROM test_data_type_conversion;
100078 (22000): String '9.8765' is too long and would be truncated
타임스탬프를 날짜로 변환합니다:
SELECT CAST(timestamp_value AS DATE) AS timestamp_to_date,
SYSTEM$TYPEOF(timestamp_to_date) AS data_type
FROM test_data_type_conversion;
+-------------------+-----------+
| TIMESTAMP_TO_DATE | DATA_TYPE |
|-------------------+-----------|
| 2024-05-09 | DATE[SB4] |
+-------------------+-----------+
더 알아보기 (Learn more)
- TRY_CAST — 오류 대신 NULL 반환
- Data type conversion — 데이터 타입 변환 개요
- SYSTEM$TYPEOF — 값의 데이터 타입 확인