SQL 데이터 형식 규칙

적용 대상:검사 표시됨 예 Databricks SQL 검사 예 Databricks Runtime으로 표시됨

Azure Databricks는 여러 규칙을 사용하여 데이터 형식 간의 충돌을 resolve.

여러 형식 간에 명시적으로 캐스팅할 수도 있습니다.

  • cast 함수 는 대부분의 형식 간에 캐스팅되고, 그렇지 않으면 오류를 반환합니다.
  • try_cast 함수캐스트 함수 처럼 작동하지만 잘못된 값을 전달하면 NULL을 반환합니다.
  • 다른 기본 제공 함수는 제공된 형식 지시문을 사용하여 형식 간에 캐스팅됩니다.

형식 승격

형식 승격은 형식을 원래 형식의 가능한 모든 값을 포함하는 동일한 형식 패밀리의 다른 형식으로 캐스팅하는 프로세스입니다. 따라서 형식 승격은 안전한 작업입니다. 예를 들어 TINYINT 의 범위는 입니다 -128127. 가능한 모든 값을 로 안전하게 승격할 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는 , , , , DOUBLEBOOLEANDATEINTERVAL, 및 로 BIGINT승격될 수 있습니다TIMESTAMP. BINARY 실제 문자열 값을 가장 일반적인 형식 으로 캐스팅할 수 없는 경우 Azure Databricks에서 런타임 오류가 발생합니다. 문자열 값으로 승격하는 INTERVAL 경우 간격 단위와 일치해야 합니다.

형식 우선 순위 그래프

이는 형식 우선 순위 목록문자열 및 NULL 규칙을 결합한 우선 순위 계층 구조를 그래픽으로 보여 줍니다.

우선 순위 규칙의 그래픽 표현

최소 일반 형식 확인

형식 집합에서 가장 일반적인 형식은 형식 집합의 모든 요소에 의해 형식 우선 순위 그래프 에서 연결할 수 있는 가장 좁은 형식입니다.

가장 일반적인 형식 확인은 다음과 같은 용도로 사용됩니다.

  • 지정된 형식의 매개 변수가 필요한 함수를 더 좁은 형식의 인수를 사용하여 호출할 수 있는지 여부를 결정합니다.
  • 병합, 최소 또는 최대와 같은 여러 매개 변수에 대해 공유 인수 형식을 예상하는 함수의 인수 형식 파생합니다.
  • 산술 연산 또는 비교와 같은 연산자의 피연산자 형식을 파생합니다.
  • 사례 식과 같은 식의 결과 형식을 파생합니다.
  • 배열 생성자에 대한 요소, 키 또는 값 형식을 파생합니다.
  • UNION, INTERSECT 또는 EXCEPT 집합 연산자의 결과 형식을 파생합니다.

가장 일반적인 형식이 로 확인되면 특수 규칙이 적용됩니다 FLOAT. 기여하는 형식 중 하나라도 정확한 숫자 형식(TINYINT, , SMALLINT, INTEGERBIGINT또는 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(날짜, 일) 에는 및 가 DATEINTEGER예상됩니다.

    두 s를 사용하여 호출 date_add() 하는 경우 Azure Databricks는 첫 번째 DATESTRING 를 로, 두 번째 STRING 를 로 크로스캐스트합니다INTEGER.STRING

  • 함수가 숫자 형식(예: INTEGER또는 DATE 형식)을 예상하지만 인수가 또는 TIMESTAMP와 같은 DOUBLE 보다 일반적인 형식인 경우 Azure Databricks는 인수를 해당 매개 변수 형식으로 암시적으로 다운캐스트합니다.

    예를 들어 date_add(날짜, 일) 에는 및 가 DATEINTEGER예상됩니다.

    BIGINTTIMESTAMP 사용하여 를 호출 date_add() 하는 경우 Azure Databricks는 시간 구성 요소를 BIGINTINTEGER제거하고 를 로 다운캐스트TIMESTAMPDATE 합니다.

  • 그렇지 않으면 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

암시적 다운캐스팅으로 인해 또는 BIGINTTIMESTAMP 사용하여 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