Reglas de tipo de datos de SQL
Se aplica a: Databricks SQL Databricks Runtime
Azure Databricks usa varias reglas para resolver conflictos entre tipos de datos:
- La promoción expande de forma segura un tipo a otro más amplio.
- La conversión de un tipo heredado limita un tipo. Es lo contrario de la promoción.
- La conversión cruzada transforma un tipo en otro tipo de otra familia.
También puede convertir explícitamente entre muchos tipos:
- la función de conversión convierte entre la mayoría de los tipos y devuelve errores si no puede hacerlo.
- la función try_cast sirve como la función de conversión, pero devuelve NULL cuando se pasan valores no válidos.
- Otras funciones integradas se convierten entre tipos mediante directivas de formato proporcionadas.
Promoción de tipos
La promoción de tipos es el proceso de convertir un tipo en otro de la misma familia que contiene todos los valores posibles del original.
Por lo tanto, la promoción de tipos es una operación segura. Por ejemplo, TINYINT
tiene un rango de -128
a 127
. Todos sus valores posibles se pueden promocionar de forma segura a INTEGER
.
Lista de precedencia de tipos
La lista de precedencia de tipos define si los valores de un tipo de datos determinado se pueden promocionar implícitamente a otro tipo de datos.
Tipo de datos | Lista de precedencia (de más limitado a más amplio) |
---|---|
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 | VARIANT |
OBJECT | OBJECT (3) |
(1) Para una resolución de tipo menos común, FLOAT
se omite para evitar la pérdida de precisión.
(2) Para un tipo complejo, la regla de precedencia se aplica de forma recursiva a sus elementos de componente.
(3) OBJECT
solo existe dentro de un elemento VARIANT
.
Cadenas y NULL
Se aplican reglas especiales a STRING
y a NULL
sin tipo:
NULL
se puede promocionar a cualquier otro tipo.STRING
se puede promocionar aBIGINT
,BINARY
,BOOLEAN
,DATE
,DOUBLE
,INTERVAL
yTIMESTAMP
. Si el valor de cadena real no se puede convertir al tipo menos común, Azure Databricks genera un error en tiempo de ejecución. Al promocionar aINTERVAL
, el valor de cadena debe coincidir con las unidades de intervalo.
Gráfico de precedencia de tipos
Se trata de una representación gráfica de la jerarquía de precedencia, que combina la lista de precedencia de tipos y las reglas de cadenas y NULL.
Resolución de los tipos menos comunes
El tipo menos común de un conjunto de tipos es el más limitado al que pueden acceder todos los elementos del conjunto desde el gráfico de precedencia de tipos.
La resolución de tipos menos común se usa para:
- Decidir si se puede invocar una función que espera un parámetro de un tipo determinado mediante un argumento de un tipo más limitado.
- Derivar el tipo de argumento para una función que espera un tipo de argumento compartido para varios parámetros, como coalesce, in, least o greatest.
- Derivar los tipos de operando para operadores como operaciones aritméticas o comparaciones.
- Derivar el tipo de resultado para expresiones como case.
- Derivar los tipos de elemento, clave o valor para constructores de matriz y mapa.
- Derivar el tipo de resultado de los operadores de conjunto UNION, INTERSECT o EXCEPT.
Se aplican reglas especiales si el tipo menos común se resuelve en FLOAT
. Si alguno de los tipos que contribuyen es un tipo numérico exacto (TINYINT
, SMALLINT
, INTEGER
, BIGINT
o DECIMAL
), se inserta el tipo menos común en DOUBLE
para evitar una posible pérdida de dígitos.
Conversión a tipo heredado y cruzada implícitas
Azure Databricks emplea estas formas de conversión implícita solo en la invocación de función y operador y únicamente en aquellos casos en que se pueda determinar inequívocamente la intención.
Conversión a tipo heredado implícita
La conversión a tipo heredado implícita convierte automáticamente un tipo más amplio a otro más limitado sin necesidad de especificar la conversión de forma explícita. La conversión a tipo heredado es práctica, pero conlleva el riesgo de errores inesperados en tiempo de ejecución si el valor real no se puede representar en el tipo limitado.
La conversión a tipo heredado aplica la lista de precedencia de tipos en orden inverso.
Conversión cruzada implícita
La conversión cruzada implícita convierte un valor de una familia de tipos a otra sin necesidad de especificar explícitamente la conversión.
Azure Databricks admite la conversión cruzada implícita en los siguientes casos:
- De cualquier tipo simple, excepto
BINARY
, aSTRING
- De
STRING
a cualquier tipo simple
- De cualquier tipo simple, excepto
Conversión al invocarse una función
Dada una función o un operador resueltos, se aplican las siguientes reglas, en el orden en que se enumeran, para cada par de parámetro y argumento:
Si un tipo de parámetro admitido forma parte del gráfico de precedencia de tipos del argumento, Azure Databricks promociona el argumento a dicho tipo de parámetro.
En la mayoría de los casos, la descripción de la función indica explícitamente los tipos o la cadenas que se admiten, como "cualquier tipo numérico".
Por ejemplo, sin(expr) funciona con
DOUBLE
, pero acepta cualquier valor numérico.Si el tipo de parámetro esperado es
STRING
, y el argumento es un tipo simple, Azure Databricks convierte de forma cruzada el argumento al tipo de parámetro de cadena.Por ejemplo, substr(str, start, len) espera que
str
seaSTRING
. En su lugar, puede pasar un tipo numérico o de fecha y hora.Si el tipo de argumento es
STRING
, y el tipo de parámetro esperado es simple, Azure Databricks convierte de forma cruzada el argumento de cadena al tipo de parámetro más amplio que se admite.Por ejemplo, date_add(date, days) espera
DATE
yINTEGER
.Si invoca
date_add()
con dos argumentosSTRING
, Azure Databricks convierte de forma cruzada el primer argumentoSTRING
aDATE
y el segundo argumentoSTRING
aINTEGER
.Si la función espera un tipo numérico, como
INTEGER
, o un tipoDATE
, pero el argumento es un tipo más general, comoDOUBLE
oTIMESTAMP
, Azure Databricks convierte implícitamente el argumento a dicho tipo de parámetro.Por ejemplo, date_add(date, days) espera
DATE
yINTEGER
.Si invoca
date_add()
con un argumentoTIMESTAMP
y un argumentoBIGINT
, Azure Databricks convierte el argumentoTIMESTAMP
aDATE
eliminando el componente de tiempo y el argumentoBIGINT
aINTEGER
.De lo contrario, Azure Databricks genera un error.
Ejemplos
La función coalesce acepta cualquier conjunto de tipos de argumento siempre que compartan un tipo menos común.
El tipo del resultado es el tipo menos común de los argumentos.
-- 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
La función substring espera argumentos de tipo STRING
para la cadena y INTEGER
para los parámetros start y 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) permite la conversión cruzada implícita a cadena.
-- 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 se puede invocar con un argumento TIMESTAMP
o BIGINT
debido a la conversión a tipo heredado implícita.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add se puede invocar con argumentos STRING
debido a la conversión a tipo heredado implícita.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05