Regras de tipo de dados SQL
Aplica-se a: Databricks SQL Databricks Runtime
O Azure Databricks usa várias regras para resolver conflitos entre tipos de dados:
- A promoção expande com segurança um tipo para um tipo mais amplo.
- O downcasting implícito estreita um tipo. O oposto da promoção.
- O crosscasting implícito transforma um tipo em um tipo de outra família de tipos.
Você também pode transmitir explicitamente entre vários tipos:
- A função Cast transmite entre a maioria dos tipos e retorna erros se não for possível.
- try_cast função funciona como função de transmissão, mas retorna NULL quando passados valores inválidos.
- Outras funções incorporadas são transmitidas entre tipos usando diretivas de formato fornecidas.
Tipo de promoção
A promoção de tipo é o processo de fundir 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 tipo é uma operação segura. Por exemplo TINYINT
, tem um intervalo de -128
até 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 tipo define se os valores de um determinado tipo de dados podem ser implicitamente promovidos para outro tipo de dados.
Tipo de dados | Lista de precedências (da mais estreita para a mais larga) |
---|---|
TINYINT | TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DUPLO |
SMALLINT | SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DUPLO |
INT | INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DUPLO |
BIGINT | BIGINT -> DECIMAL -> FLOAT (1) -> DUPLO |
DECIMAL | DECIMAL -> FLOAT (1) -> DUPLO |
FLUTUAR | FLUTUADOR (1) -> DUPLO |
DUPLO | DUPLO |
DATE | DATA -> CARIMBO DE DATA/HORA |
TIMESTAMP | CARIMBO DE DATA/HORA |
MATRIZ | MATRIZ (2) |
BINÁRIO | BINÁRIO |
BOOLEANO | BOOLEANO |
INTERVALO | INTERVALO |
MAPA | MAPA (2) |
STRING | STRING |
ESTRUTURA | ESTRUTURA (2) |
VARIANTE | VARIANTE |
OBJETO | OBJETO (3) |
(1) Para o tipo menos comum, a resolução FLOAT
é ignorada para evitar perda de precisão.
(2) Para um tipo complexo, a regra de precedência aplica-se recursivamente aos seus elementos componentes.
(3) OBJECT
existe apenas dentro de um VARIANT
.
Strings e NULL
Aplicam-se regras especiais para STRING
e não tipificadas NULL
:
NULL
pode ser promovido para qualquer outro tipo.STRING
pode ser promovido aBIGINT
,BINARY
,BOOLEAN
,DATE
,DOUBLE
INTERVAL
, eTIMESTAMP
. Se o valor real da cadeia de caracteres não puder ser convertido para o tipo menos comum, o Azure Databricks gerará um erro de tempo de execução. Ao promover paraINTERVAL
o valor da cadeia de caracteres deve corresponder às unidades de intervalo.
Gráfico de precedência de tipo
Esta é uma representação gráfica da hierarquia de precedência, combinando a lista de precedência de tipo e cadeias de caracteres e regras NULLs .
Resolução de tipo menos comum
O tipo menos comum de um conjunto de tipos é o tipo mais estreito alcançável a partir do gráfico de precedência de tipo por todos os elementos do conjunto de tipos.
A resolução de tipo menos comum é usada para:
- Decida se uma função que espera um parâmetro de um determinado tipo pode ser invocada usando um argumento de um tipo mais restrito.
- Derive 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.
- Derive os tipos de operando para operadores, como operações aritméticas ou comparações.
- Derive o tipo de resultado para expressões como a expressão de maiúsculas e minúsculas.
- Derive os tipos de elemento, chave ou valor para construtores de matriz e mapa .
- Derive o tipo de resultado dos operadores de conjunto UNION , INTERSECT ou EXCEPT .
Aplicam-se regras especiais se o tipo menos comum for resolvido para FLOAT
. Se qualquer um dos tipos contribuintes for um tipo numérico exato (, , , , ou DECIMAL
), o tipo menos comum é empurrado para DOUBLE
evitar a perda potencial de dígitos. BIGINT
INTEGER
SMALLINT
TINYINT
Downcasting implícito e crosscasting
O Azure Databricks emprega essas formas de transmissão implícita somente na invocação de função e operador e somente quando puder determinar inequivocamente a intenção.
Downcasting implícito
O downcasting implícito converte automaticamente um tipo mais amplo para um tipo mais estreito sem exigir que você especifique o elenco explicitamente. O downcasting é conveniente, mas acarreta o risco de erros de tempo de execução inesperados se o valor real não for representável no tipo estreito.
O downcasting aplica a lista de precedência de tipo na ordem inversa.
Crosscasting implícito
O crosscasting implícito converte um valor de uma família de tipos para outra sem exigir que você especifique a transmissão explicitamente.
O Azure Databricks dá suporte à transmissão cruzada implícita de:
- Qualquer tipo simples, exceto
BINARY
, paraSTRING
. - A
STRING
para qualquer tipo simples.
- Qualquer tipo simples, exceto
Transmissão na invocação de função
Dada uma função ou operador resolvido, as seguintes regras se aplicam, na ordem em que são listadas, para cada parâmetro e par de argumentos:
Se um tipo de parâmetro com suporte fizer parte do gráfico 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 indica explicitamente os tipos ou cadeias suportados, como "qualquer tipo numérico".
Por exemplo, sin(expr) opera em
DOUBLE
, mas aceitará qualquer numérico.Se o tipo de parâmetro esperado for um
STRING
e o argumento for um tipo simples, o Azure Databricks fará a conversão do argumento para o tipo de parâmetro string.Por exemplo, substr(str, start, len) espera
str
ser umSTRING
. Em vez disso, você pode passar um tipo numérico ou datetime.Se o tipo de argumento for um
STRING
e o tipo de parâmetro esperado for um tipo simples, o Azure Databricks fará a conversão do argumento string para o tipo de parâmetro com suporte mais amplo.Por exemplo, date_add(data, dias) espera um
DATE
e umINTEGER
.Se você invocar
date_add()
com doisSTRING
s, o Azure Databricks fará a conversão cruzada do primeiroSTRING
paraDATE
e o segundoSTRING
para umINTEGER
arquivo .Se a função espera um tipo numérico, como um
INTEGER
, ou umDATE
tipo, mas o argumento é um tipo mais geral, como umDOUBLE
ouTIMESTAMP
, o Azure Databricks implicitamente reduz o argumento para esse tipo de parâmetro.Por exemplo, um date_add(data, dias) espera um
DATE
e umINTEGER
.Se você invocar
date_add()
com aTIMESTAMP
e aBIGINT
, o Azure Databricks reduzirá oTIMESTAMP
paraDATE
removendo o componente de tempo e oBIGINT
para umINTEGER
.Caso contrário, o Azure Databricks gerará um erro.
Exemplos
A função coalesce aceita qualquer conjunto de tipos de argumento, desde que compartilhem um tipo menos comum.
O tipo de resultado é o tipo menos 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: 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
A função substring espera argumentos do tipo STRING
para a string e INTEGER
para os parâmetros start e 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 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 a downcasting implícito.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add pode ser invocado com STRING
s devido ao crosscasting implícito.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05