데이터 타입 변환

대부분의 경우, 한 데이터 타입의 값을 다른 데이터 타입으로 변환할 수 있습니다. 예를 들어 INTEGER부동 소수점 데이터 타입 으로 변환할 수 있습니다. 데이터 타입을 변환하는 것을 캐스팅 이라고 합니다.

이 항목의 내용:

명시적 캐스팅 vs 암시적 캐스팅

사용자는 값을 한 데이터 타입에서 다른 데이터 타입으로 명시적으로 변환할 수 있습니다. 이것을 명시적 캐스팅 이라고 합니다.

경우에 따라 Snowflake는 값을 다른 데이터 타입으로 자동 변환합니다. 이것을 암시적 캐스팅 또는 강제 변환 이라고 합니다.

명시적 캐스팅

사용자는 다음 옵션 중 하나를 사용하여 명시적으로 값을 캐스팅할 수 있습니다.

  • CAST 함수.

  • :: 연산자(캐스트 연산자 라고 함).

  • 적절한 SQL 함수(예: TO_DOUBLE).

예:

SELECT CAST('2022-04-01' AS DATE);

SELECT '2022-04-01'::DATE;

SELECT TO_DATE('2022-04-01');
Copy

WHERE 절을 포함하여 일반적 식이 허용되는 대부분의 컨텍스트에서 캐스팅이 허용됩니다. 예:

SELECT date_column
    FROM log_table
    WHERE date_column >= '2022-04-01'::DATE;
Copy

암시적 캐스팅(《강제 변환》)

강제 변환은 함수(또는 연산자)가 인자(또는 피연산자)와는 다르되 호환되는 데이터 타입을 요구할 때 발생합니다.

  • 함수 또는 저장 프로시저의 예:

    • 다음 코드는 FLOAT를 예상하는 my_float_function() 함수에 값을 전달할 수 있도록 my_integer_column 열의 INTEGER 값을 FLOAT로 강제 변환합니다.

      SELECT my_float_function(my_integer_column)
          FROM my_table;
      
      Copy
  • 연산자의 예:

    • 다음 코드는 || 연산자를 사용하여 값을 연결할 수 있도록 INTEGER 값 17 을 VARCHAR로 강제 변환합니다.

      SELECT 17 || '76';
      
      Copy

      이 SELECT 문의 결과는 문자열 '1776' 입니다.

    • 다음 문은 < 비교 연산자를 사용하여 값을 값 my_float_column 과 비교할 수 있도록 my_integer_column 열의 INTEGER 값을 FLOAT로 강제 변환합니다.

      SELECT ...
          FROM my_table
          WHERE my_integer_column < my_float_column;
      
      Copy

모든 컨텍스트(예: 모든 연산자가 아님)가 강제 변환을 지원하는 것은 아닙니다.

캐스팅 및 우선순위

식 내에서 캐스팅할 때 코드는 식의 다른 연산자에 상대적인 캐스트 연산자의 우선순위를 고려해야 합니다.

다음 예를 살펴보겠습니다.

SELECT height * width::VARCHAR || " square meters"
    FROM dimensions;
Copy

캐스트 연산자는 산술 연산자 * (곱하기)보다 우선순위가 높으므로 문은 다음과 같이 해석됩니다.

... height * (width::VARCHAR) ...
Copy

height * width 의 결과를 캐스팅하려면 아래와 같이 괄호를 사용합니다.

SELECT (height * width)::VARCHAR || " square meters"
    FROM dimensions;
Copy

또 다른 예로 다음 문을 고려하십시오.

SELECT -0.0::FLOAT::BOOLEAN;
Copy

다음과 같이 해석될 것으로 예상할 수 있습니다.

SELECT (-0.0::FLOAT)::BOOLEAN;
Copy

따라서 FALSE (0 = FALSE, 1 = TRUE)를 반환합니다.

그러나 캐스트 연산자는 단항 빼기(부정) 연산자보다 우선순위가 높으므로 문은 다음과 같이 해석됩니다.

SELECT -(0.0::FLOAT::BOOLEAN);
Copy

따라서 단항 빼기를 BOOLEAN에 적용할 수 없기 때문에 오류 메시지가 나타납니다.

캐스팅할 수 있는 데이터 타입

아래 표는 Snowflake의 유효한 데이터 타입 변환을 보여줍니다. 이 표에는 Snowflake가 자동으로 수행할 수 있는 강제 변환도 나와 있습니다.

참고

내부적으로는 CAST 함수 및 :: 연산자는 적절한 변환 함수를 호출합니다. 예를 들어 NUMBER를 BOOLEAN으로 캐스팅하면 Snowflake가 TO_BOOLEAN 함수를 호출합니다. 각 변환 함수의 사용법 노트는 함수가 캐스팅을 통해 간접적으로 호출될 때와 함수가 직접 호출될 때 적용됩니다. 예를 들어 CAST(my_decimal_column as BOOLEAN) 를 실행하는 경우, DECIMAL 값으로 TO_BOOLEAN 을 호출하는 규칙이 적용됩니다. 편의를 위해 아래 표의 《참고》 열에는 관련 변환 함수에 대한 링크가 포함되어 있습니다.

반정형 유형정형 유형 간의 변환에 대한 자세한 내용은 정형 유형과 반정형 유형 변환하기 섹션을 참조하십시오.

소스 데이터 타입

대상 데이터 타입

캐스팅 가능

강제 변환 가능

변환 함수

참고

ARRAY

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

BINARY

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

BOOLEAN

NUMBER

TO_NUMBER

VARCHAR

TO_VARCHAR

예를 들어, TRUE에서 〈true’로.

VARIANT

TO_VARIANT

DATE

TIMESTAMP

TO_TIMESTAMP

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

FLOAT . (부동 소수점 숫자)

BOOLEAN

TO_BOOLEAN

예를 들어, 0.0에서 FALSE로.

NUMBER[(p,s)]

TO_NUMBER

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

GEOGRAPHY

VARIANT

TO_VARIANT

GEOMETRY

VARIANT

TO_VARIANT

NUMBER[(p,s)] . (INTEGER를 포함하여 고정 소수점 숫자)

BOOLEAN

TO_BOOLEAN

예를 들어, 0에서 FALSE로.

FLOAT

TO_DOUBLE

TIMESTAMP

TO_TIMESTAMP

1

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

OBJECT

ARRAY

TO_ARRAY

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

TIME

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

TIMESTAMP

DATE

TO_DATE , DATE

TIME

TO_TIME , TIME

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

VARCHAR

BOOLEAN

TO_BOOLEAN

예를 들어,〉false’에서 FALSE로.

DATE

TO_DATE , DATE

FLOAT

TO_DOUBLE

예를 들어, 〈12.34’에서 12.34로.

NUMBER[(p,s)]

TO_NUMBER

예를 들어, 〈12.34’에서 12.34로.

TIME

TO_TIME , TIME

TIMESTAMP

TO_TIMESTAMP

VARIANT

TO_VARIANT

VARIANT

ARRAY

TO_ARRAY

BOOLEAN

TO_BOOLEAN

예를 들어, 〈false’를 포함하는 VARIANT에서 FALSE로.

DATE

TO_DATE , DATE

FLOAT

TO_DOUBLE

GEOGRAPHY

TO_GEOGRAPHY

NUMBER[(p,s)]

TO_NUMBER

OBJECT

TO_OBJECT

TIME

TO_TIME , TIME

TIMESTAMP

TO_TIMESTAMP

VARCHAR

TO_VARCHAR

1

값은 Epoch 시작(1970-01-01 00:00:00) 이후 초로 처리되기 때문에 NUMBER를 TIMESTAMP로 변환할 수 있습니다.

참고:

  • 나열된 각 데이터 타입(예: FLOAT)에 대해 해당 데이터 타입의 모든 별칭에 규칙이 적용됩니다(예: FLOAT에 대한 규칙은 FLOAT의 별칭인 DOUBLE에 적용됨).

사용법 노트

달리 명시된 경우를 제외하고 다음 규칙은 명시적 캐스팅과 암시적 캐스팅 둘 다에 적용됩니다.

  • 변환은 데이터 타입뿐만 아니라 소스의 값에 따라 달라집니다. 예:

    • VARCHAR 〈123’은 숫자 값으로 변환할 수 있지만 VARCHAR 〈xyz’는 숫자 값으로 변환할 수 없습니다.

    • VARIANT 타입의 특정 값을 캐스팅하는 기능은 VARIANT 내부의 데이터 타입에 따라 다릅니다. 예를 들어 VARIANT에 TIME 타입의 값이 포함되어 있는 경우, TIME을 TIMESTAMP로 캐스팅할 수 없기 때문에 VARIANT를 TIMESTAMP로 캐스팅할 수 없습니다.

  • 가능하면 같은 유형의 인자를 전달하십시오. 다른 유형의 인자는 전달하지 않도록 하십시오.

  • 인자 중 하나가 숫자인 경우 이 함수는 숫자가 아닌 문자열 인자(예: 'a string')와 상수가 아닌 문자열 인자를 NUMBER(18,5) 형식으로 강제 변환 합니다.

    상수가 아닌 숫자형 문자열 인자의 경우 NUMBER(18,5)가 숫자 값을 나타내기에 충분하지 않은 경우 해당 값을 나타낼 수 있는 형식으로 인자를 캐스팅 해야 합니다.

  • 일부 데이터 타입 페어의 경우, 변환으로 인해 정밀도가 손실될 수 있습니다. 예:

    • FLOAT를 INTEGER로 변환하면 값이 반올림됩니다.

    • 고정 소수점 숫자(예: NUMBER(38, 0))에서 부동 소수점(예: FLOAT)으로 값을 변환하면 고정 소수점 숫자를 부동 소수점 숫자로 정확하게 표현할 수 없는 경우 반올림되거나 잘릴 수 있습니다.

    • TIMESTAMP를 DATE로 변환하면 하루 중 시간에 대한 정보가 제거됩니다.

  • Snowflake는 정밀도 손실이 발생할 수 있는 일부 상황에서 값을 변환하지만, Snowflake는 정밀도 손실이 발생하는 다른 상황에서는 변환을 허용하지 않습니다. 예를 들어 Snowflake는 변환이 다음과 같은 경우 변환을 허용하지 않습니다.

    • VARCHAR 값을 자릅니다. 예를 들어 Snowflake는 암시적으로든 명시적으로든 VARCHAR(10)을 VARCHAR(5)로 변환하지 않습니다.

    • 최하위 자릿수 이외의 자릿수가 손실됩니다. 예를 들어 다음은 실패합니다.

      select 12.3::FLOAT::NUMBER(3,2);
      
      Copy

    이 예에서 숫자 12.3 은 소수점 앞에 두 자리가 있지만, 데이터 타입 NUMBER(3,2) 에는 소수점 앞에 한 자리만 들어갈 수 있는 공간이 있습니다.

  • 정밀도가 낮은 타입에서 정밀도가 더 높은 타입으로 변환할 때 변환은 기본값을 사용합니다. 예를 들어 DATE를 TIMESTAMP_NTZ로 변환하면 시, 분, 초, 소수 자릿수 초가 0으로 설정됩니다.

  • FLOAT 값이 VARCHAR로 캐스팅되면 후행 0이 생략됩니다.

    예를 들어, 다음 문은 테이블을 만들고 VARCHAR, FLOAT, VARIANT를 포함하는 행을 삽입합니다. VARIANT는 후행 0으로 표시되는 부동 소수점 값을 포함하는 JSON으로 생성됩니다.

    create or replace table tmp (
        varchar1 varchar, 
        float1 float, 
        variant1 variant
        );
    
    insert into tmp select '5.000', 5.000, parse_json('{"Loan Number": 5.000}');
    
    Copy

    다음 SELECT 문은 FLOAT 열과 VARIANT 열 내부의 FLOAT 값을 둘 다 VARCHAR로 명시적으로 캐스팅합니다. 각각의 경우에 VARCHAR에는 후행 0이 없습니다.

    select varchar1, 
           float1::varchar,
           variant1:"Loan Number"::varchar from tmp;
    +----------+-----------------+---------------------------------+
    | VARCHAR1 | FLOAT1::VARCHAR | VARIANT1:"LOAN NUMBER"::VARCHAR |
    |----------+-----------------+---------------------------------|
    | 5.000    | 5               | 5                               |
    +----------+-----------------+---------------------------------+
    
    Copy
  • 일부 작업은 조건식에 따라 다른 데이터 타입을 반환할 수 있습니다. 예를 들어 다음 COALESCE호출은 입력 값에 따라 약간 다른 데이터 타입을 반환합니다.

    select system$typeof(ifnull(12.3, 0)),
           system$typeof(ifnull(NULL, 0));
    
    +--------------------------------+--------------------------------+
    | SYSTEM$TYPEOF(IFNULL(12.3, 0)) | SYSTEM$TYPEOF(IFNULL(NULL, 0)) |
    +--------------------------------+--------------------------------+
    | NUMBER(3,1)[SB1]               | NUMBER(1,0)[SB1]               |
    +--------------------------------+--------------------------------+
    
    Copy

    식에 둘 이상의 가능한 데이터 타입이 있는 경우 Snowflake는 실제 결과를 기반으로 데이터 타입을 선택합니다. (계산의 정밀도 및 스케일에 대한 자세한 내용은 산술 연산의 소수 자릿수와 전체 자릿수 섹션을 참고하십시오.) 쿼리가 둘 이상의 결과(예: 결과의 여러 행)를 생성하는 경우 Snowflake는 각 개별 결과를 보유할 수 있는 데이터 타입을 선택합니다.

  • SnowSQL과 같은 일부 애플리케이션 프로그램 및 Classic Console 와 같은 일부 그래픽 사용자 인터페이스는 데이터를 표시할 때 고유한 변환 및 형식 지정 규칙을 적용합니다. 예를 들어, SnowSQL는 BINARY 값을 16진수만 포함하는 문자열로 표시합니다. 해당 문자열은 변환 함수를 암시적으로 호출하여 생성됩니다. 따라서 SnowSQL이 표시하는 데이터는 Snowflake가 강제로 변환한 데이터를 명확하게 나타내지는 않을 수 있습니다.