데이터 타입 변환¶
대부분의 경우, 한 데이터 타입의 값을 다른 데이터 타입으로 변환할 수 있습니다. 예를 들어, INTEGER 값은 부동 소수점 데이터 타입 값으로 변환할 수 있습니다. 데이터 타입을 변환하는 것을 형 변환 이라고 합니다.
명시적 캐스팅 vs 암시적 캐스팅¶
사용자는 값을 한 데이터 타입에서 다른 데이터 타입으로 명시적으로 변환할 수 있습니다. 이것을 명시적 캐스팅 이라고 합니다.
경우에 따라 Snowflake는 값을 다른 데이터 타입으로 자동 변환합니다. 이것을 암시적 캐스팅 또는 강제 변환 이라고 합니다.
명시적 캐스팅¶
사용자는 다음 옵션 중 하나를 사용하여 명시적으로 값을 캐스팅할 수 있습니다.
예를 들어, 각 쿼리는 문자열 값을 DATE 값으로 형 변환합니다.
SELECT CAST('2022-04-01' AS DATE); SELECT '2022-04-01'::DATE; SELECT TO_DATE('2022-04-01');
WHERE 절을 포함하여 일반적 식이 허용되는 대부분의 컨텍스트에서 캐스팅이 허용됩니다. 예:
SELECT date_column FROM log_table WHERE date_column >= '2022-04-01'::DATE;
암시적 형 변환(“강제 변환”)¶
강제 변환은 함수(또는 연산자)가 인자(또는 피연산자)와는 다르되 호환되는 데이터 타입을 요구할 때 발생합니다.
함수 또는 저장 프로시저의 예:
다음 코드는 FLOAT를 예상하는
my_float_function()함수에 값을 전달할 수 있도록my_integer_column열의 INTEGER 값을 FLOAT로 강제 변환합니다.SELECT my_float_function(my_integer_column) FROM my_table;
연산자의 예:
모든 컨텍스트(예: 모든 연산자가 강제성을 지원하는 것은 아님)에서 강제성을 지원하는 것은 아닙니다.
캐스팅 및 우선순위¶
식 내에서 캐스팅할 때 코드는 식의 다른 연산자에 상대적인 캐스트 연산자의 우선순위를 고려해야 합니다.
다음 예를 살펴보겠습니다.
SELECT height * width::VARCHAR || ' square meters'
FROM dimensions;
캐스트 연산자는 산술 연산자 ``*``(곱하기)보다 우선순위가 높으므로 문은 다음과 같이 해석됩니다.
... height * (width::VARCHAR) ...
식 ``height * width``의 결과를 캐스팅하려면 다음 예제와 같이 괄호를 사용합니다.
SELECT (height * width)::VARCHAR || ' square meters'
FROM dimensions;
또 다른 예로 다음 문을 고려하십시오.
SELECT -0.0::FLOAT::BOOLEAN;
다음 예제와 같이 해석될 것으로 예상할 수 있습니다.
SELECT (-0.0::FLOAT)::BOOLEAN;
따라서FALSE (0 = FALSE , 1 = TRUE)를 반환해야 합니다.
그러나 캐스트 연산자는 단항 빼기(부정) 연산자보다 우선순위가 높으므로 문은 다음 예제와 같이 해석됩니다.
SELECT -(0.0::FLOAT::BOOLEAN);
따라서 BOOLEAN 에는단항 마이너스를 적용할 수 없기 때문에 쿼리 결과에 오류 메시지가 표시됩니다.
캐스팅할 수 있는 데이터 타입¶
다음 테이블은 Snowflake에서 유효한 데이터 타입 변환을 보여줍니다. 이 표에는 Snowflake가 자동으로 수행할 수 있는 강제 변환도 나와 있습니다.
참고
내부적으로 CAST 함수 및 :: 연산자는 적절한 변환 함수를 호출합니다. 예를 들어, NUMBER를 BOOLEAN로 캐스팅하는 경우, Snowflake는 TO_BOOLEAN 함수를 호출합니다. 각 변환 함수의 사용법 노트는 함수가 캐스트를 사용하여 간접적으로 호출될 때와 함수가 직접 호출될 때 적용됩니다. 예를 들어, :code:`CAST(my_decimal_column AS BOOLEAN)`를 실행하는 경우 DECIMAL 값이 있는 TO_BOOLEAN 호출 규칙이 적용됩니다. 편의를 위해 테이블에 관련 변환 함수에 대한 링크가 포함되어 있습니다.
반정형화 타입 간의 변환에 대한 자세한 내용은 정형 유형과 반정형 유형 변환하기 섹션을 참조하세요.
소스 데이터 타입 |
대상 데이터 타입 |
캐스팅 가능 |
강제 변환 가능 |
변환 함수 |
참고 |
|---|---|---|---|---|---|
ARRAY |
|||||
✔ |
❌ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
||||
BINARY |
|||||
✔ |
❌ |
없습니다. |
|||
✔ |
❌ |
없습니다. |
|||
BOOLEAN |
|||||
✔ |
✔ |
예를 들어, |
|||
✔ |
❌ |
없습니다. |
|||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
없습니다. |
|||
DATE |
|||||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
❌ |
없습니다. |
|||
DECFLOAT :newline:`.`*(부동 소수점 숫자)* |
|||||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
FLOAT . (부동 소수점 숫자) |
|||||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
GEOGRAPHY |
|||||
✔ |
❌ |
없습니다. |
|||
GEOMETRY |
|||||
✔ |
❌ |
없습니다. |
|||
NUMBER[(p,s)] . (고정 소수점 숫자, INTEGER 포함) |
|||||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
||||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
OBJECT |
|||||
✔ |
❌ |
없습니다. |
|||
✔ |
❌ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
TIME |
|||||
✔ |
✔ |
없습니다. |
|||
✔ |
❌ |
없습니다. |
|||
TIMESTAMP |
|||||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
❌ |
없습니다. |
|||
VARCHAR |
|||||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
❌ |
없습니다. |
|||
VARIANT |
|||||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
❌ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
✔ |
없습니다. |
|||
✔ |
❌ |
VARIANT에는 FLOAT 타입이나 INT 타입으로 구성된 ARRAY가 포함되어야 합니다. |
|||
VECTOR |
|||||
✔ |
✔ |
없습니다. |
참고
나열된 각 데이터 타입(예: FLOAT)에 대해 해당 데이터 타입의 모든 별칭에 규칙이 적용됩니다(예: FLOAT에 대한 규칙은 FLOAT의 별칭인 DOUBLE에 적용됨).
사용법 노트¶
달리 명시된 경우를 제외하고 다음 규칙은 명시적 형 변환과 암시적 형 변환 둘 다에 적용됩니다.
변환은 소스의 데이터 타입뿐만 아니라 값에 따라 달라집니다. 예를 들면 다음과 같습니다.
VARCHAR 값
'123'은 숫자 값으로 변환할 수 있지만, VARCHAR 값'xyz'는 숫자 값으로 변환할 수 없습니다.유형 VARIANT의 특정 값을 캐스팅하는 기능은 VARIANT 내부의 데이터 타입에 따라 다릅니다. 예를 들어, VARIANT에 TIME 유형의 값이 포함된 경우 TIME 값을 TIMESTAMP 값에 캐스팅할 수 없으므로 VARIANT 값을 TIMESTAMP 값에 캐스팅할 수 없습니다.
Snowflake는 인자가 호환되도록 하기 위해 암시적 변환 <label-when_coercion_occurs>`을 수행합니다. 예를 들어, 입력 식 중 하나가 숫자 유형인 경우 반환 유형도 숫자 유형입니다. 즉, :code:`SELECT COALESCE(‘17’, 1);`은 먼저 VARCHAR 값 :code:’17’`을 NUMBER 값 :code:`17`로 변환한 후 첫 번째 NULL이 아닌 값을 반환합니다.
변환이 불가능하면 암시적 변환이 실패합니다. 예를 들어,
SELECT COALESCE('foo', 1);`은 VARCHAR 값 :code:’foo’`를 NUMBER 값으로 변환할 수 없으므로 오류를 반환합니다.동일한 유형의 인자를 전달하거나 필요한 경우 인자를 명시적으로 변환하는 것이 좋습니다.
암시적 변환이 숫자가 아닌 값을 숫자 값으로 변환하는 경우 결과는 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);
이 예제에서
12.3숫자는 소수점 앞에 자릿수가 두 자리이지만 데이터 타입NUMBER(3,2)는 소수점 앞에 자릿수가 한 자리만 있습니다.
정밀도가 낮은 타입에서 정밀도가 더 높은 타입으로 변환할 때 변환은 기본값을 사용합니다. 예를 들어, DATE 값을 TIMESTAMP_NTZ 값으로 변환하면 시, 분, 초 및 분수 초가
0으로 설정됩니다.FLOAT 값을 VARCHAR 값으로 형 변환하면 후행 0이 생략됩니다.
예를 들어, 다음 문은 테이블을 만들고 VARCHAR 값, FLOAT 값 및 VARIANT 값을 포함하는 행을 삽입합니다. VARIANT 값은 후행이 0으로 표시되는 부동 소수점 값을 포함하는 JSON으로 구성됩니다.
CREATE OR REPLACE TABLE convert_test_zeros ( varchar1 VARCHAR, float1 FLOAT, variant1 VARIANT); INSERT INTO convert_test_zeros SELECT '5.000', 5.000, PARSE_JSON('{"Loan Number": 5.000}');
다음 SELECT 문은 FLOAT 열과 VARIANT 열 내부의 FLOAT 값을 둘 다 VARCHAR로 명시적으로 캐스팅합니다. 각각의 경우에 VARCHAR에는 후행 0이 없습니다.
SELECT varchar1, float1::VARCHAR, variant1:"Loan Number"::VARCHAR FROM convert_test_zeros;
+----------+-----------------+---------------------------------+ | VARCHAR1 | FLOAT1::VARCHAR | VARIANT1:"LOAN NUMBER"::VARCHAR | |----------+-----------------+---------------------------------| | 5.000 | 5 | 5 | +----------+-----------------+---------------------------------+
일부 작업은 조건식에 따라 다른 데이터 타입을 반환할 수 있습니다. 예를 들어, 다음 IFNULL 호출은 입력 값에 따라 약간 다른 데이터 타입을 반환합니다.
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] | +--------------------------------+--------------------------------+
식에 둘 이상의 가능한 데이터 타입이 있는 경우 Snowflake는 실제 결과를 기반으로 데이터 타입을 선택합니다. 계산의 전체 자릿수와 소수 자릿수에 대한 자세한 내용은 산술 연산의 소수 자릿수와 전체 자릿수 섹션을 참조하세요. 쿼리가 둘 이상의 결과(예: 여러 행의 결과)를 생성하는 경우 Snowflake는 각 개별 결과를 보유할 수 있는 데이터 타입을 선택합니다.
Some applications, such as SnowSQL, and some graphical user interfaces, such as Snowsight, apply their own conversion and formatting rules when they display data. For example, SnowSQL displays BINARY values as a string that contains only hexadecimal digits; that string is generated by implicitly calling a conversion function. Therefore, the data that SnowSQL displays might not unambiguously indicate which data conversions that Snowflake coerced.