Prioridad de tipo SQL databricks

Databricks SQL varias reglas que rigen cómo se resuelven los conflictos entre tipos de datos. En el centro de esta resolución de conflictos se encuentra la lista de precedencia de tipos que define si los valores de un tipo de datos determinado se pueden promover implícitamente a otro tipo de datos.

Tipo de datos Lista de precedencia (de más estrecha a más amplia)
TINYINT TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT- -> 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
MATRIZ ARRAY (2)
BINARY BINARY
BOOLEAN BOOLEAN
INTERVAL INTERVAL
MAP MAP (2)
CADENA STRING
ESTRUCTURA STRUCT (2)

(1) Para una resolución de tipos menos común, se omite FLOAT 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 componentes.

Literales de cadena y NULL

Se aplican reglas especiales para literales de cadena y NULL sin tipo.

Un valor NULL se puede promover a cualquier otro tipo. Un literal de cadena se puede promover a cualquier tipo de datos simple.

Se trata de una representación gráfica de la jerarquía de precedencia:

Representación gráfica de reglas de precedencia

Resolución de tipos menos común

El tipo menos común de un conjunto de tipos es el tipo más reducido accesible desde la lista de precedencia por todos los elementos del conjunto de tipos.

La resolución de tipos menos común se usa para:

  • Decida si una función que espera un parámetro de un tipo se puede invocar mediante un argumento de un tipo más estrecho.
  • Derive el tipo de argumento para las funciones que esperan un tipo de argumento compartido para varios parámetros, como coalesce, least o greatest.
  • Derive los tipos de operando para operadores como operaciones aritméticas o comparaciones.
  • Derive el tipo de resultado para expresiones como la expresión case.
  • Derive los tipos de elemento, clave o valor para los constructores de matriz y mapa.

Se aplican reglas especiales si el tipo menos común se resuelve en FLOAT:

Si alguno de los tipos que contribuyen es INT, BIGINT o DECIMAL, el tipo menos común se inserta en DOUBLE para evitar la posible pérdida de dígitos.

Ejemplos

La función coalesce acepta cualquier conjunto de tipos de argumento, siempre y cuando compartan un tipo menos común.

El tipo de resultado es el tipo menos común de los argumentos.

> SELECT typeof(coalesce(1Y, 1L, NULL));
  BIGINT

> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]

> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)))
  ARRAY<BIGINT>

> SELECT typeof(coalesce(1, 1F))
  DOUBLE

> SELECT typeof(coalesce(1L, 1F))
  DOUBLE

> SELECT (typeof(coalesce(1BD, 1F))
  DOUBLE

La función de subcadena espera argumentos de tipo INT para los parámetros start y length.

> SELECT substring('hello', 1Y, 2);
he

> SELECT substring('hello', 1, 2);
He

> SELECT substring('hello', '1', 2);
he

> SELECT substring('hello', 1L, 2);
Error: Argument 2 requires an INT type.

> SELECT substring('hello', str, 2)
  FROM VALUES(CAST('1' AS STRING)) AS T(str);
Error: Argument 2 requires an INT type.