SQL 데이터 형식 규칙
적용 대상: Databricks SQL Databricks Runtime으로 표시됨
Azure Databricks는 여러 규칙을 사용하여 데이터 형식 간의 충돌을 resolve.
- 승격 은 형식을 더 넓은 형식으로 안전하게 확장합니다.
- 암시적 다운캐스팅은 형식의 범위를 좁혀줍니다. 승격의 반대입니다.
- 암시적 크로스캐스팅 은 형식을 다른 형식 패밀리의 형식으로 변환합니다.
여러 형식 간에 명시적으로 캐스팅할 수도 있습니다.
- cast 함수 는 대부분의 형식 간에 캐스팅되고, 그렇지 않으면 오류를 반환합니다.
- try_cast 함수 는 캐스트 함수 처럼 작동하지만 잘못된 값을 전달하면 NULL을 반환합니다.
- 다른 기본 제공 함수는 제공된 형식 지시문을 사용하여 형식 간에 캐스팅됩니다.
형식 승격
형식 승격은 형식을 원래 형식의 가능한 모든 값을 포함하는 동일한 형식 패밀리의 다른 형식으로 캐스팅하는 프로세스입니다.
따라서 형식 승격은 안전한 작업입니다. 예를 들어 TINYINT
의 범위는 입니다 -128
127
. 가능한 모든 값을 로 안전하게 승격할 INTEGER
수 있습니다.
형식 우선 순위 목록
형식 우선 순위 목록은 지정된 데이터 형식의 값을 암시적으로 다른 데이터 형식으로 승격할 수 있는지 여부를 정의합니다.
데이터 형식 | 우선 순위 목록(가장 좁은 항목에서 가장 넓은 목록까지) |
---|---|
Tinyint | TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
Smallint | SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
Int | INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
Bigint | BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
10 진수 | DECIMAL -> FLOAT (1) -> DOUBLE |
플 로트 | FLOAT (1) -> DOUBLE |
더블 | 더블 |
날짜 | DATE -> TIMESTAMP |
타임 스탬프 | timestamp |
배열 | ARRAY (2) |
이진 | 이진 |
부울 | 부울 |
간격 | 간격 |
지도 | MAP (2) |
문자열 | 문자열 |
구조체 | STRUCT (2) |
(1) 정밀도 손실을 방지하기 위해 가장 일반적인 형식 확인 FLOAT를 건너뜁니다.
(2) 복합 형식의 경우 우선 순위 규칙이 해당 구성 요소에 재귀적으로 적용됩니다.
문자열 및 NULL
특수 규칙은 및 형식화되지 않은 에 STRING
적용됩니다 NULL
.
NULL
는 다른 형식으로 승격될 수 있습니다.STRING
는 , , , ,DOUBLE
BOOLEAN
DATE
INTERVAL
, 및 로BIGINT
승격될 수 있습니다TIMESTAMP
.BINARY
실제 문자열 값을 가장 일반적인 형식 으로 캐스팅할 수 없는 경우 Azure Databricks에서 런타임 오류가 발생합니다. 문자열 값으로 승격하는INTERVAL
경우 간격 단위와 일치해야 합니다.
형식 우선 순위 그래프
이는 형식 우선 순위 목록 과 문자열 및 NULL 규칙을 결합한 우선 순위 계층 구조를 그래픽으로 보여 줍니다.
최소 일반 형식 확인
형식 집합에서 가장 일반적인 형식은 형식 집합의 모든 요소에 의해 형식 우선 순위 그래프 에서 연결할 수 있는 가장 좁은 형식입니다.
가장 일반적인 형식 확인은 다음과 같은 용도로 사용됩니다.
- 지정된 형식의 매개 변수가 필요한 함수를 더 좁은 형식의 인수를 사용하여 호출할 수 있는지 여부를 결정합니다.
- 병합, 최소 또는 최대와 같은 여러 매개 변수에 대해 공유 인수 형식을 예상하는 함수의 인수 형식을 파생합니다.
- 산술 연산 또는 비교와 같은 연산자의 피연산자 형식을 파생합니다.
- 사례 식과 같은 식의 결과 형식을 파생합니다.
- 배열 및 맵 생성자에 대한 요소, 키 또는 값 형식을 파생합니다.
- UNION, INTERSECT 또는 EXCEPT 집합 연산자의 결과 형식을 파생합니다.
가장 일반적인 형식이 로 확인되면 특수 규칙이 적용됩니다 FLOAT
. 기여하는 형식 중 하나라도 정확한 숫자 형식(TINYINT
, , SMALLINT
, INTEGER
BIGINT
또는 DECIMAL
)인 경우 잠재적인 숫자 손실을 방지하기 위해 DOUBLE
가장 일반적인 형식이 푸시됩니다.
암시적 다운캐스팅 및 크로스캐스팅
Azure Databricks는 함수 및 연산자 호출에서만 이러한 형태의 암시적 캐스팅을 사용하며 의도를 명확하게 확인할 수 있는 경우에만 사용합니다.
암시적 다운캐스팅
암시적 다운캐스팅은 캐스트를 명시적으로 지정할 필요 없이 더 넓은 형식을 더 좁은 형식으로 자동으로 캐스팅합니다. 다운캐스팅은 편리하지만 실제 값이 좁은 형식으로 표시되지 않을 경우 예기치 않은 런타임 오류가 발생할 위험이 있습니다.
다운캐스팅은 형식 우선 순위 목록을 역순으로 적용합니다.
암시적 크로스캐스팅
암시적 크로스캐스팅은 캐스트를 명시적으로 지정하지 않고도 한 형식 패밀리에서 다른 형식 패밀리로 값을 캐스팅합니다.
Azure Databricks는 다음에서 암시적 크로스캐스팅을 지원합니다.
- 를 제외한
BINARY
모든 단순 형식은 에서 로 지정됩니다STRING
. STRING
모든 단순 형식에 대한 입니다.
- 를 제외한
함수 호출 시 캐스팅
확인된 함수 또는 연산자가 지정된 경우 각 매개 변수 및 인수 쌍에 대해 나열된 순서대로 다음 규칙이 적용됩니다.
지원되는 매개 변수 형식이 인수의 형식 우선 순위 그래프에 속하는 경우 Azure Databricks는 인수를 해당 매개 변수 형식으로 승격합니다 .
대부분의 경우 함수 설명은 지원되는 형식 또는 체인(예: "모든 숫자 형식")을 명시적으로 명시합니다.
예를 들어 sin(expr) 은 에서
DOUBLE
작동하지만 모든 숫자를 허용합니다.예상 매개 변수 형식이 이
STRING
고 인수가 간단한 형식인 경우 Azure Databricks는 인수를 문자열 매개 변수 형식으로 크로스캐스트합니다 .예를 들어 substr(str, start, len)은 가 될
STRING
것으로 예상합니다str
. 대신 숫자 또는 datetime 형식을 전달할 수 있습니다.인수 형식이 이
STRING
고 예상되는 매개 변수 형식이 단순 형식인 경우 Azure Databricks는 문자열 인수를 지원되는 가장 넓은 매개 변수 형식으로 크로스캐스트합니다 .예를 들어 date_add(날짜, 일) 에는 및 가
DATE
INTEGER
예상됩니다.두 s를 사용하여 호출
date_add()
하는 경우 Azure Databricks는 첫 번째DATE
STRING
를 로, 두 번째STRING
를 로 크로스캐스트합니다INTEGER
.STRING
함수가 숫자 형식(예:
INTEGER
또는DATE
형식)을 예상하지만 인수가 또는TIMESTAMP
와 같은DOUBLE
보다 일반적인 형식인 경우 Azure Databricks는 인수를 해당 매개 변수 형식으로 암시적으로 다운캐스트합니다.예를 들어 date_add(날짜, 일) 에는 및 가
DATE
INTEGER
예상됩니다.및
BIGINT
를TIMESTAMP
사용하여 를 호출date_add()
하는 경우 Azure Databricks는 시간 구성 요소를BIGINT
INTEGER
제거하고 를 로 다운캐스트TIMESTAMP
DATE
합니다.그렇지 않으면 Azure Databricks에서 오류가 발생합니다.
예
coalesce 함수는 최소 공통 형식을 공유하는 한 모든 인수 형식 집합을 허용합니다.
결과 형식은 인수의 가장 일반적인 형식이 가장 적습니다.
-- The least common type of TINYINT and BIGINT is BIGINT
> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT
-- INTEGER and DATE do not share a precedence chain or support crosscasting in either direction.
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]
-- Both are ARRAYs and the elements have a least common type
> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)))
ARRAY<BIGINT>
-- The least common type of INT and FLOAT is DOUBLE
> SELECT typeof(coalesce(1, 1F))
DOUBLE
> SELECT typeof(coalesce(1L, 1F))
DOUBLE
> SELECT typeof(coalesce(1BD, 1F))
DOUBLE
-- The least common type between an INT and STRING is BIGINT
> SELECT typeof(coalesce(5, '6'));
BIGINT
-- The least common type is a BIGINT, but the value is not BIGINT.
> SELECT coalesce('6.1', 5);
Error: 6.1 is not a BIGINT
-- The least common type between a DECIMAL and a STRING is a DOUBLE
> SELECT typeof(coalesce(1BD, '6'));
DOUBLE
부분 문자열 함수는 문자열 및 시작 및 INTEGER
길이 매개 변수에 대한 형식 STRING
의 인수를 예상합니다.
-- Promotion of TINYINT to INTEGER
> SELECT substring('hello', 1Y, 2);
he
-- No casting
> SELECT substring('hello', 1, 2);
he
-- Casting of a literal string
> SELECT substring('hello', '1', 2);
he
-- Downcasting of a BIGINT to an INT
> SELECT substring('hello', 1L, 2);
he
-- Crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
FROM VALUES(CAST('1' AS STRING)) AS T(str);
he
-- Crosscasting from INTEGER to STRING
> SELECT substring(12345, 2, 2);
23
|| (CONCAT) 는 문자열에 대한 암시적 크로스캐스팅을 허용합니다.
-- A numeric is cast to STRING
> SELECT 'This is a numeric: ' || 5.4E10;
This is a numeric: 5.4E10
-- A date is cast to STRING
> SELECT 'This is a date: ' || DATE'2021-11-30';
This is a date: 2021-11-30
암시적 다운캐스팅으로 인해 또는 BIGINT
를 TIMESTAMP
사용하여 date_add 호출할 수 있습니다.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
암시 적 크로스캐스팅으로 인해 를 사용하여 date_add 호출 STRING
할 수 있습니다.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05