Правила типов данных 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 можно вызывать с помощью STRING
s из-за неявного перекрестного вещания.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05