데이터 타입 변환¶
대부분의 경우, 한 데이터 타입의 값을 다른 데이터 타입으로 변환할 수 있습니다. 예를 들어, 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;
연산자의 예:
다음 코드는
||
연산자를 사용하여 값을 연결할 수 있도록 INTEGER 값17
을 VARCHAR로 강제 변환합니다.SELECT 17 || '76';
이 SELECT 문의 결과는 문자열
'1776'
입니다.다음 문은
<
비교 연산자를 사용하여 값을 값my_float_column
과 비교할 수 있도록my_integer_column
열의 INTEGER 값을 FLOAT로 강제 변환합니다.SELECT ... FROM my_table WHERE my_integer_column < my_float_column;
모든 컨텍스트(예: 모든 연산자가 강제성을 지원하는 것은 아님)에서 강제성을 지원하는 것은 아닙니다.
캐스팅 및 우선순위¶
식 내에서 캐스팅할 때 코드는 식의 다른 연산자에 상대적인 캐스트 연산자의 우선순위를 고려해야 합니다.
다음 예를 살펴보겠습니다.
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 함수를 호출합니다. 각 변환 함수에 대한 사용법 노트는 함수가 직접 호출되는 경우뿐만 아니라 형 변환을 사용하여 간접적으로 호출되는 경우에도 적용됩니다. 예를 들어 CAST(my_decimal_column AS BOOLEAN)
를 실행하는 경우, DECIMAL 값으로 TO_BOOLEAN 을 호출하는 규칙이 적용됩니다. 편의를 위해 테이블에는 관련 변환 함수에 대한 링크가 포함되어 있습니다.
반정형 유형 와 정형 유형 간의 변환에 대한 자세한 내용은 정형 유형과 반정형 유형 변환하기 섹션을 참조하십시오.
소스 데이터 타입 |
대상 데이터 타입 |
캐스팅 가능 |
강제 변환 가능 |
변환 함수 |
참고 |
---|---|---|---|---|---|
ARRAY |
|||||
✔ |
❌ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
BINARY |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
BOOLEAN |
|||||
✔ |
❌ |
||||
✔ |
✔ |
예를 들어, |
|||
✔ |
✔ |
||||
DATE |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
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 값으로 형 변환할 수 없습니다.
가능하면 같은 유형의 인자를 전달하십시오. 다른 유형의 인자는 전달하지 않도록 하십시오.
인자 중 하나가 숫자인 경우 이 함수는 숫자가 아닌 문자열 인자(예:
'a string'
)와 상수가 아닌 문자열 인자를 NUMBER(18,5) 형식으로 강제 변환 합니다.상수가 아닌 숫자형 문자열 인자의 경우 NUMBER(18,5)가 숫자 값을 나타내기에 충분하지 않으면 해당 값을 나타낼 수 있는 형식으로 인자를 형 변환 해야 합니다.
일부 데이터 타입 페어의 경우, 변환으로 인해 정밀도가 손실될 수 있습니다. 예:
FLOAT 값을 INTEGER 값으로 변환하면 값이 반올림됩니다.
고정 소수점 숫자(예: NUMBER(38, 0))를 부동 소수점(예: FLOAT)으로 값을 변환할 때 고정 소수점 숫자를 부동 소수점으로 정확하게 표현할 수 없는 경우 반올림 또는 잘림이 발생할 수 있습니다.
TIMESTAMP 값을 DATE 값으로 변환하면 시간 정보가 제거됩니다.
정밀도 손실이 발생할 수 있는 일부 상황에서는 값을 변환할 수 있지만, 정밀도 손실이 발생할 수 있는 다른 상황에서는 변환을 허용하지 않습니다. 예를 들어, 변환이 가능할 때 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는 각 개별 결과를 담을 수 있는 데이터 타입을 선택합니다.
SnowSQL과 같은 일부 애플리케이션 프로그램 및 Classic Console 와 같은 일부 그래픽 사용자 인터페이스는 데이터를 표시할 때 고유한 변환 및 형식 지정 규칙을 적용합니다. 예를 들어, SnowSQL는 BINARY 값을 16진수만 포함하는 문자열로 표시합니다. 해당 문자열은 변환 함수를 암시적으로 호출하여 생성됩니다. 따라서 SnowSQL이 표시하는 데이터는 Snowflake가 강제로 변환한 데이터를 명확하게 나타내지는 않을 수 있습니다.