Правила типов данных 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 —> FLOAT (1) —> DOUBLE
ПЛАВАТЬ FLOAT (1) —> DOUBLE
ДВУХМЕСТНЫЙ ДВУХМЕСТНЫЙ
ДАТА ДАТА —> МЕТКА ВРЕМЕНИ
TIMESTAMP TIMESTAMP
МАССИВА ARRAY (2)
ДВОИЧНОМ ДВОИЧНОМ
ЛОГИЧЕСКИХ ЛОГИЧЕСКИХ
ИНТЕРВАЛ ИНТЕРВАЛ
КАРТА MAP (2)
СТРОКА СТРОКА
СТРУКТУРА STRUCT (2)

(1) Для наименее распространенных типов разрешение FLOAT пропускается, чтобы избежать потери точности.

(2) Для сложного типа правило очередности применяется рекурсивно к его составным элементам.

Строки и NULL

Особые правила применяются к STRING и нетипизированным NULL:

  • NULL может быть повышен до любого другого типа.
  • STRING можно повысить до BIGINT, BINARY, BOOLEAN, DATE, DOUBLE, , INTERVALи TIMESTAMP. Если фактическое строковое значение не может быть приведено к наименее распространенному типу , Azure Databricks вызывает ошибку среды выполнения. При повышении до INTERVAL строкового значения должно соответствовать единицам интервалов.

Граф очередности типов

Это графическое изображение иерархии очередности, объединяющее список приоритетов типов, строки и правила NUL.

Графическое представление правил очередности

Разрешение наименее распространенных типов

Наименее распространенный тип из набора типов — это самый узкий тип, доступный из графа приоритета типов всеми элементами набора типов.

Наименее распространенное разрешение типов используется для:

  • Решите, можно ли вызывать функцию, которая ожидает параметр заданного типа, с помощью аргумента более узкого типа.
  • Наследуйте тип аргумента для функции, которая ожидает общий тип аргумента для нескольких параметров, таких как объединение, наименьшее или наибольшее значение.
  • Наследуйте типы операндов для таких операторов, как арифметические операции или сравнения.
  • Наследуйте тип результата для выражений, таких как выражение case.
  • Наследуйте типы элементов, ключей или значений для конструкторов массивов и карт .
  • Получение типа результата операторов набора 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 и INTEGER.

    Если вы вызываете date_add() с двумя STRING, Azure Databricks перекрестноSTRING выполняет перекрестную рассылку DATE в , а вторую STRING — в .INTEGER

  • Если функция ожидает числовой тип, например INTEGER, или DATE тип, но аргумент является более общим типом, например DOUBLE или TIMESTAMP, Azure Databricks неявно понижает аргумент этого типа параметра.

    Например, date_add (дата, дни) ожидает DATE и INTEGER.

    Если вы вызываете date_add() с TIMESTAMP помощью и BIGINT, Azure Databricks понижаетTIMESTAMP на DATE , удалив компонент времени, а — BIGINT в INTEGER.

  • В противном случае 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

Функция substring ожидает аргументы типа STRING для строки, а также INTEGER для параметров start и length.

-- 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 можно вызывать с помощью STRINGs из-за неявного перекрестного вещания.

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