SQL 데이터 형식 규칙
적용 대상: Databricks SQL Databricks Runtime
Azure Databricks는 여러 규칙을 사용하여 데이터 형식 간의 충돌을 해결합니다.
- 승격은 한 형식을 더 넓은 형식으로 안전하게 확장합니다.
- 암시적 다운캐스팅은 형식을 좁힙니다. 승격의 반대입니다.
- 암시적 교차 캐스팅은 형식을 다른 형식 패밀리의 형식으로 변환합니다.
여러 형식 간에 명시적으로 캐스팅할 수도 있습니다.
- cast 함수는 대부분의 형식 간에 캐스팅되고, 그렇지 않으면 오류를 반환합니다.
- try_cast 함수캐스트 함수 같이 작동하지만 잘못된 values전달되면 NULL을 반환합니다.
- 다른 기본 제공 함수는 제공된 형식 지시문을 사용하여 형식 간에 캐스팅됩니다.
형식 승격
형식 승격은 특정 형식을 해당 형식의 가능한 모든 values을 포함하는 동일한 타입 계열의 다른 형식으로 변환하는 과정입니다.
따라서 형식 승격은 안전한 작업입니다. 예를 들어 TINYINT
의 범위는 -128
에서 127
입니다. 가능한 모든 values는 안전하게 INTEGER
로 승격될 수 있습니다.
타입 우선 순위 list
형식 우선 순위 list 지정된 데이터 형식의 values 다른 데이터 형식으로 암시적으로 승격할 수 있는지 여부를 정의합니다.
데이터 형식 | 우선 순위 list(가장 좁은 것에서 가장 넓은 것까지) |
---|---|
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
로 승격할 때 문자열 값은 간격 단위와 일치해야 합니다.
형식 우선 순위 그래프
이는 형식 우선 순위 list문자열과 NULL 규칙을 결합한 우선 순위 계층 구조를 그래픽으로 보여 줍니다.
최소 일반 형식 해상도
set 형식에서 가장 흔하지 않은 형식은 set 형식의 모든 요소가 형식 우선 순위 그래프에서 도달할 수 있는 가장 좁은 형식입니다.
가장 일반적인 형식 확인은 다음 작업을 수행하기 위해 사용됩니다.
- 지정된 형식의 매개 변수를 예상하는 함수가 더 좁은 형식의 인수를 사용하여 호출될 수 있는지 여부를 결정합니다.
병합 ,, 최소또는 가장 큰 같은 여러공유 인수 형식을 예상하는 함수의 인수 형식을 파생합니다. - 산술 연산 또는 비교와 같은 연산자에 대한 피연산자 형식을 파생합니다.
- 사례 식과 같은 식의 결과 형식을 파생합니다.
- 배열 및 맵 생성자의 요소, 키 또는 값 형식을 파생합니다.
- UNION, INTERSECT 또는 EXCEPTset 연산자의 결과 유형을 도출합니다.
최소 일반 형식이 FLOAT
로 확인되는 경우 특수 규칙이 적용됩니다. 기여하는 형식이 정확한 숫자 형식(TINYINT
, SMALLINT
, INTEGER
, BIGINT
또는 DECIMAL
)인 경우 잠재적인 자릿수 손실을 방지하기 위해 가장 덜 일반적인 형식이 DOUBLE
로 푸시됩니다.
가장 드문 형식이 STRING
일 경우, 데이터 정렬은 데이터 정렬 우선 순위 규칙에 따라 계산됩니다.
암시적 다운캐스팅 및 크로스캐스팅
Azure Databricks는 함수 및 연산자 호출에서만 이러한 형태의 암시적 캐스팅을 사용하고 where 의도를 명확하게 확인할 수 있습니다.
암시적 다운캐스팅
암시적 다운캐스팅은 명시적으로 캐스트를 지정할 필요 없이 자동으로 더 넓은 형식을 더 좁은 형식으로 캐스트합니다. 다운캐스팅은 편리하지만 좁은 형식에서 실제 값을 표현할 수 없는 경우 예기치 않은 런타임 오류의 위험이 있습니다.
다운캐스트는 형식의 우선 순위를 list의 역순으로 적용합니다.
암시적 크로스캐스팅
암시적 크로스캐스팅은 명시적으로 캐스트를 지정할 필요 없이 한 형식 패밀리에서 다른 형식 패밀리로 값을 캐스트합니다.
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
를 예상합니다.두 개의
date_add()
을 사용하여STRING
를 호출하면 Azure Databricks는 첫 번째 을STRING
로, 두 번째DATE
을STRING
로INTEGER
합니다.함수가
INTEGER
또는DATE
형식과 같은 숫자 형식을 예상하지만 인수가DOUBLE
또는TIMESTAMP
와 같은 보다 일반적인 형식인 경우 Azure Databricks는 해당 매개 변수 형식에 대한 인수를 암시적으로 다운캐스트합니다.예를 들어, date_add(date, days)는
DATE
및INTEGER
를 예상합니다.date_add()
및TIMESTAMP
를 사용하여BIGINT
를 호출하면 Azure Databricks는 시간 구성 요소를 제거하고 를TIMESTAMP
로 제거하여DATE
를BIGINT
로INTEGER
합니다.그렇지 않으면 Azure Databricks에서 오류가 발생합니다.
예제
병합 함수는 인수 유형이 최소 공통 유형을 공유하는 한 모든 set 를 허용합니다.
결과 형식은 인수의 최소 공통 형식입니다.
-- 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: DATATYPE_MISMATCH.DATA_DIFF_TYPES
-- 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: CAST_INVALID_INPUT
-- The least common type between a DECIMAL and a STRING is a DOUBLE
> SELECT typeof(coalesce(1BD, '6'));
DOUBLE
-- Two distinct explicit collations result in an error
> SELECT collation(coalesce('hello' COLLATE UTF8_BINARY,
'world' COLLATE UNICODE));
Error: COLLATION_MISMATCH.EXPLICIT
-- The resulting collation between two distinct implicit collations is indeterminate
> SELECT collation(coalesce(c1, c2))
FROM VALUES('hello' COLLATE UTF8_BINARY,
'world' COLLATE UNICODE) AS T(c1, c2);
NULL
-- The resulting collation between a explicit and an implicit collations is the explicit collation.
> SELECT collation(coalesce(c1 COLLATE UTF8_BINARY, c2))
FROM VALUES('hello',
'world' COLLATE UNICODE) AS T(c1, c2);
UTF8_BINARY
-- The resulting collation between an implicit and the default collation is the implicit collation.
> SELECT collation(coalesce(c1, ‘world’))
FROM VALUES('hello' COLLATE UNICODE) AS T(c1, c2);
UNICODE
-- The resulting collation between the default collation and the indeterminate collation is the default collation.
> SELECT collation(coalesce(coalesce(‘hello’ COLLATE UTF8_BINARY, ‘world’ COLLATE UNICODE), ‘world’));
UTF8_BINARY
부분 문자열 함수는 문자열에 대한 STRING
형식의 인수와 시작 및 길이 parameters대한 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