SQL 데이터 형식 규칙
적용 대상: Databricks SQL Databricks Runtime
Azure Databricks는 여러 규칙을 사용하여 데이터 형식 간의 충돌을 해결합니다.
- 승격은 한 형식을 더 넓은 형식으로 안전하게 확장합니다.
- 암시적 다운캐스팅은 형식을 좁힙니다. 승격의 반대입니다.
- 암시적 교차 캐스팅은 형식을 다른 형식 패밀리의 형식으로 변환합니다.
여러 형식 간에 명시적으로 캐스팅할 수도 있습니다.
- 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 |
DECIMAL | DECIMAL -> FLOAT (1) -> DOUBLE |
FLOAT | FLOAT (1) -> DOUBLE |
DOUBLE | DOUBLE |
DATE | DATE -> TIMESTAMP |
TIMESTAMP | TIMESTAMP |
ARRAY | ARRAY (2) |
BINARY | BINARY |
BOOLEAN | BOOLEAN |
INTERVAL | INTERVAL |
MAP | MAP (2) |
STRING | STRING |
STRUCT | STRUCT (2) |
변체 | VARIANT |
OBJECT | OBJECT (3) |
(1) 정밀도 손실을 방지하기 위해 최소 일반 형식 해상도 FLOAT
를 건너뜁니다.
(2) 복합 형식의 경우 우선 순위 규칙은 해당 구성 요소에 재귀적으로 적용됩니다.
(3) OBJECT
는 .VARIANT
문자열 및 NULL
STRING
및 형식이 지정되지 않은 NULL
에는 특별 규칙이 적용됩니다.
NULL
은 다른 형식으로 승격될 수 있습니다.STRING
은BIGINT
,BINARY
,BOOLEAN
,DATE
,DOUBLE
,INTERVAL
및TIMESTAMP
로 승격될 수 있습니다. 실제 문자열 값을 최소 일반 형식으로 캐스팅할 수 없는 경우 Azure Databricks에서 런타임 오류가 발생합니다.INTERVAL
로 승격할 때 문자열 값은 간격 단위와 일치해야 합니다.
형식 우선 순위 그래프
이는 형식 우선 순위 목록과 문자열 및 NULL 규칙을 결합한 우선 순위 계층 구조를 그래픽으로 나타낸 것입니다.
최소 일반 형식 해상도
형식 집합에서 가장 덜 일반적인 형식은 형식 집합의 모든 요소가 형식 우선 순위 그래프에서 도달할 수 있는 가장 좁은 형식입니다.
가장 일반적인 형식 확인은 다음 작업을 수행하기 위해 사용됩니다.
- 지정된 형식의 매개 변수를 예상하는 함수가 더 좁은 형식의 인수를 사용하여 호출될 수 있는지 여부를 결정합니다.
- coalesce, in, least 또는 greatest와 같은 여러 매개 변수에 대한 공유 인수 형식을 예상하는 함수의 인수 형식을 파생합니다.
- 산술 연산 또는 비교와 같은 연산자에 대한 피연산자 형식을 파생합니다.
- 사례 식과 같은 식의 결과 형식을 파생합니다.
- 배열 및 맵 생성자의 요소, 키 또는 값 형식을 파생합니다.
- 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)은
str
이STRING
일 것으로 예상합니다. 대신 숫자 또는 날짜/시간 형식을 전달할 수 있습니다.인수 형식이
STRING
이고 예상 매개 변수 형식이 단순 형식이면 Azure Databricks는 지원되는 가장 넓은 매개 변수 형식으로 문자열 인수를 크로스캐스트합니다.예를 들어, date_add(date, days)는
DATE
및INTEGER
를 예상합니다.두 개의
STRING
을 사용하여date_add()
를 호출하면 Azure Databricks는 첫 번째STRING
을DATE
로, 두 번째STRING
을INTEGER
로 크로스캐스트합니다.함수가
INTEGER
또는DATE
형식과 같은 숫자 형식을 예상하지만 인수가DOUBLE
또는TIMESTAMP
와 같은 보다 일반적인 형식인 경우 Azure Databricks는 해당 매개 변수 형식에 대한 인수를 암시적으로 다운캐스트합니다.예를 들어, date_add(date, days)는
DATE
및INTEGER
를 예상합니다.TIMESTAMP
및BIGINT
를 사용하여date_add()
를 호출하면 Azure Databricks는 시간 구성 요소를 제거하고BIGINT
를INTEGER
로 제거하여TIMESTAMP
를DATE
로 다운캐스트합니다.그렇지 않으면 Azure Databricks에서 오류가 발생합니다.
예제
병합 함수는 최소 일반 형식을 공유하는 한 모든 인수 형식 집합을 허용합니다.
결과 형식은 인수의 최소 공통 형식입니다.
-- 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
하위 문자열 함수는 문자열에 대해 STRING
형식의 인수를, 시작 및 길이 매개 변수에 대해 INTEGER
형식의 인수를 예상합니다.
-- 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
date_add는 암시적 다운캐스팅으로 인해 TIMESTAMP
또는 BIGINT
와 함께 호출될 수 있습니다.
> 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