Compartilhar via


Regras de tipo de dados SQL

Aplica-se a:seleção marcada como sim Databricks SQL seleção marcada como sim Databricks Runtime

O Azure Databricks usa várias regras para resolver conflitos entre tipos de dados:

Você também pode converter explicitamente entre muitos tipos:

Promoção de tipos

Promoção de tipos é o processo de conversão de um tipo em outro tipo da mesma família de tipos que contém todos os valores possíveis do tipo original. Portanto, a promoção de tipos é uma operação segura. Por exemplo, TINYINT tem um intervalo de -128 a 127. Todos os seus valores possíveis podem ser promovidos com segurança para INTEGER.

Lista de precedência de tipos

A lista de precedência de tipos define se os valores de determinado tipo de dados podem ser promovidos implicitamente para outro tipo de dados.

Tipo de dados Lista de precedência (da mais restrita para a mais ampla)
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 DATA –> CARIMBO DE DATA/HORA
TIMESTAMP TIMESTAMP
ARRAY ARRAY (2)
BINARY BINARY
BOOLEAN BOOLEAN
INTERVAL INTERVAL
GEOGRAFIA GEOGRAFIA(QUALQUER)
GEOMETRIA GEOMETRY(ANY)
MAP MAP (2)
STRING STRING
STRUCT STRUCT (2)
VARIANT VARIANT
OBJECT OBJECT (3)

(1) Para a resoluçãoFLOAT de tipo menos comum, é ignorada para evitar perda de precisão.

(2) Para um tipo complexo, a regra de precedência se aplica recursivamente aos seus elementos de componente.

(3)OBJECT existe somente dentro de um VARIANT.

Cadeias de caracteres e NULL

Regras especiais se aplicam a STRING e NULL não digitado:

  • NULL pode ser promovido a qualquer outro tipo.
  • STRING pode ser promovido a BIGINT, BINARY, BOOLEAN, DATE, DOUBLE, INTERVAL e TIMESTAMP. Se o valor real da cadeia de caracteres não puder ser convertido em um tipo mínimo comum, o Azure Databricks gerará um erro de tempo de execução. Ao promover para INTERVAL, o valor da cadeia de caracteres deve corresponder às unidades de intervalos.

Grafo de precedência de tipos

Essa é uma representação gráfica da hierarquia de precedência, combinando a lista de precedência de tipos e as regras de cadeia de caracteres e NULLs.

Representação gráfica das regras de precedência

Resolução de tipo mínimo comum

O tipo mínimo comum em um conjunto de tipos é o mais restrito do grafo de precedência de tipos acessível por todos os elementos do conjunto de tipos.

A resolução de tipo mínimo comum é usada para:

  • Decidir se uma função que espera um parâmetro de determinado tipo pode ser chamada com o uso de um argumento de um tipo mais restrito.
  • Derivar o tipo de argumento para uma função que espera um tipo de argumento compartilhado para vários parâmetros, como coalesce, in, least ou greatest.
  • Derivar os tipos de operando para operadores como operações aritméticas ou comparações.
  • Derivar o tipo de resultado para expressões como a expressão de caso.
  • Derivar os tipos de elemento, chave ou valor para os construtores de array e mapa.
  • Derivar o tipo de resultado dos operadores de conjunto UNION, INTERSECT ou EXCEPT.

Regras especiais serão aplicadas se o tipo mínimo comum for resolvido para FLOAT. Se qualquer um dos tipos contribuintes for um tipo numérico exato (TINYINT, SMALLINT, INTEGER, BIGINT ou DECIMAL), o tipo mínimo comum será enviado por push para DOUBLE para evitar uma possível perda de dígitos.

Quando o tipo menos comum é um STRING, a ordenação é computada seguindo as regras de precedência de ordenação.

Downcasting e crosscasting implícitos

O Azure Databricks emprega essas formas de conversão implícita somente em invocação de função e de operador, e apenas onde ela pode determinar a intenção de forma não ambígua.

  • Conversão descendente implícita

    O downcasting implícito converte automaticamente um tipo mais amplo em outro mais restrito, sem exigir a especificação explícita da conversão. O downcasting é conveniente, mas implica risco de erros de tempo de execução inesperados se o valor real não puder ser representável no tipo limitado.

    O downcasting aplica a lista de precedência de tipo na ordem inversa. Os tipos de dados GEOGRAPHY e GEOMETRY nunca são rebaixados.

  • Transmissão cruzada implícita

    O crosscasting implícito converte um valor de uma família de tipos em outro, sem exigir que você especifique a conversão explicitamente.

    O Azure Databricks oferece suporte a crosscasting implícito de:

    • Qualquer tipo simples, exceto BINARY, GEOGRAPHY, e GEOMETRY, para STRING.
    • Uma STRING para qualquer tipo simples, exceto GEOGRAPHY e GEOMETRY.

Casting na invocação de função

Dada uma função ou um operador resolvido, as regras a seguir se aplicam, na ordem em que estão listadas, a cada parâmetro e par de argumentos:

  • Se um tipo de parâmetro com suporte fizer parte do grafo de precedência de tipo do argumento, o Azure Databricks promoverá o argumento para esse tipo de parâmetro.

    Na maioria dos casos, a descrição da função declara explicitamente os tipos ou a cadeia com suporte, como "qualquer tipo numérico".

    Por exemplo, sin(expr) opera em DOUBLE, mas aceitará qualquer valor numérico.

  • Se o tipo de parâmetro esperado for um STRING e o argumento for um tipo simples, o Azure Databricks cruzará o argumento para o tipo de parâmetro de cadeia de caracteres .

    Por exemplo, substr(str, start, len) espera que str seja uma STRING. Em vez disso, você pode transmitir um tipo numérico ou de data e hora.

  • Se o tipo de argumento for um STRING e o tipo de parâmetro esperado for um tipo simples, o Azure Databricks faz a conversão do argumento string para o tipo de parâmetro mais abrangente com suporte.

    Por exemplo, date_add(data, dias) espera um DATE e um INTEGER.

    Se você invocar date_add() com dois STRINGs, o Azure Databricks cruzará o primeiro STRING para DATE e o segundo STRING para um INTEGER.

  • Se a função espera um tipo numérico, como um INTEGER ou um tipo DATE, mas o argumento é um tipo mais geral, como um DOUBLE ou TIMESTAMP, o Azure Databricks implicitamente faz downcast do argumento para esse tipo de parâmetro.

    Por exemplo, um date_add(data, dias) espera um DATE e um INTEGER.

    Se você invocar date_add() com um TIMESTAMP e um BIGINT, o Azure Databricks realiza o downcast do TIMESTAMP para DATE removendo o componente de tempo e do BIGINT para um INTEGER.

  • Caso contrário, o Azure Databricks gerará um erro.

Examples

A coalesce função aceita qualquer conjunto de tipos de argumento, desde que compartilhem um tipo menos comum.

O tipo de resultado é o tipo mínimo comum dos 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: DATATYPE_MISMATCH.DATA_DIFF_TYPES

-- 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: CAST_INVALID_INPUT

-- The least common type between a DECIMAL and a STRING is a DOUBLE
>  SELECT typeof(coalesce(1BD, '6'));
  DOUBLE

-- Two distinct explicit collations result in an error
>  SELECT collation(coalesce('hello' COLLATE UTF8_BINARY,
                             'world' COLLATE UNICODE));
  Error: COLLATION_MISMATCH.EXPLICIT

-- The resulting collation between two distinct implicit collations is indeterminate
>  SELECT collation(coalesce(c1, c2))
     FROM VALUES('hello' COLLATE UTF8_BINARY,
                 'world' COLLATE UNICODE) AS T(c1, c2);
  NULL

-- The resulting collation between a explicit and an implicit collations is the explicit collation.
> SELECT collation(coalesce(c1 COLLATE UTF8_BINARY, c2))
    FROM VALUES('hello',
                'world' COLLATE UNICODE) AS T(c1, c2);
  UTF8_BINARY

-- The resulting collation between an implicit and the default collation is the implicit collation.
> SELECT collation(coalesce(c1, 'world'))
    FROM VALUES('hello' COLLATE UNICODE) AS T(c1, c2);
  UNICODE

-- The resulting collation between the default collation and the indeterminate collation is the default collation.
> SELECT collation(coalesce(coalesce('hello' COLLATE UTF8_BINARY, 'world' COLLATE UNICODE), 'world'));
  UTF8_BINARY

-- Least common type between GEOGRAPHY(srid) and GEOGRAPHY(ANY)
> SELECT typeof(coalesce(st_geogfromtext('POINT(1 2)'), to_geography('POINT(3 4)'), NULL));
  geography(any)

-- Least common type between GEOMETRY(srid1) and GEOMETRY(srid2)
> SELECT typeof(coalesce(st_geomfromtext('POINT(1 2)', 4326), st_geomfromtext('POINT(3 4)', 3857), NULL));
  geometry(any)

-- Least common type between GEOMETRY(srid1) and GEOMETRY(ANY)
> SELECT typeof(coalesce(st_geomfromtext('POINT(1 2)', 4326), to_geometry('POINT(3 4)'), NULL));
  geometry(any)

A substring função espera argumentos de tipo STRING para a cadeia de caracteres e INTEGER para os parâmetros de início e comprimento.

-- 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 o crosscasting implícito para string.

-- 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 pode ser invocado com um TIMESTAMP ou BIGINT devido ao downcasting implícito (conversão de tipo descendente).

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

date_add pode ser invocado com STRINGs devido ao cast cruzado implícito.

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