다음을 통해 공유


SQL 데이터 형식 규칙

적용 대상: 예(예)로 표시된 확인 Databricks SQL 예(예)로 표시된 확인 Databricks 런타임

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)

(1) 최소 일반 형식 확인의 경우 정밀도 손실을 방지하기 위해 FLOAT를 건너뜁니다.

(2) 복합 형식의 경우 우선 순위 규칙은 해당 구성 요소에 재귀적으로 적용됩니다.

문자열 및 NULL

STRING 및 형식이 지정되지 않은 NULL에는 특별 규칙이 적용됩니다.

  • NULL은 다른 형식으로 승격될 수 있습니다.
  • STRINGBIGINT, BINARY, BOOLEAN, DATE, DOUBLE, INTERVALTIMESTAMP로 승격될 수 있습니다. 실제 문자열 값을 최소 일반 형식으로 캐스팅할 수 없는 경우 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)strSTRING일 것으로 예상합니다. 대신 숫자 또는 날짜/시간 형식을 전달할 수 있습니다.

  • 인수 형식이 STRING이고 예상 매개 변수 형식이 단순 형식이면 Azure Databricks는 지원되는 가장 넓은 매개 변수 형식으로 문자열 인수를 크로스캐스트합니다.

    예를 들어, date_add(date, days)DATEINTEGER를 예상합니다.

    두 개의 STRING을 사용하여 date_add()를 호출하면 Azure Databricks는 첫 번째 STRINGDATE로, 두 번째 STRINGINTEGER크로스캐스트합니다.

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

    예를 들어, date_add(date, days)DATEINTEGER를 예상합니다.

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

  • 그렇지 않으면 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_addSTRING과 함께 호출할 수 있습니다.

> SELECT date_add('2011-11-30 08:30:00', '5');
  2011-12-05