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)