O MaxCompute SQL permite conversões entre diferentes tipos de dados. Essas conversões podem ser explícitas ou implícitas.
Conversão explícita
A conversão explícita usa a função CAST para converter um valor de um tipo de dado em outro. A tabela a seguir mostra as conversões explícitas compatíveis com o MaxCompute SQL. Para obter mais informações sobre essa função, consulte CAST.
|
De/para |
BIGINT |
DOUBLE |
STRING |
DATETIME |
BOOLEAN |
DECIMAL |
FLOAT |
|
BIGINT |
N/A |
Y |
Y |
N |
Y |
Y |
Y |
|
DOUBLE |
Y |
N/A |
Y |
N |
Y |
Y |
Y |
|
STRING |
Y |
Y |
N/A |
Y |
Y |
Y |
Y |
|
DATETIME |
N |
N |
Y |
N/A |
N |
N |
N |
|
BOOLEAN |
Y |
Y |
Y |
N |
N/A |
Y |
Y |
|
DECIMAL |
Y |
Y |
Y |
N |
Y |
N/A |
Y |
|
FLOAT |
Y |
Y |
Y |
N |
Y |
Y |
N/A |
Nesta tabela, Y indica que há suporte à conversão, N indica que não há suporte e N/A significa que nenhuma conversão é necessária. Tentar uma conversão explícita sem suporte resulta em erro.
-
Dados de exemplo
NotaOs exemplos a seguir usam uma tabela
usercom estes dados de amostra.create table if not exists user ( user_name string, user_id bigint, age bigint ); insert into user values ('zhangsan',111,20); -
Exemplos
SELECT CAST(user_id AS DOUBLE) AS new_id from user; SELECT CAST('2015-10-01 00:00:00' AS DATETIME) AS new_date; SELECT CAST(ARRAY(1,2,3) AS ARRAY<STRING>); SELECT CONCAT_WS(',', CAST(ARRAY(1, 2) AS ARRAY<STRING>));
Notas de uso e limitações
Ao converter o tipo DOUBLE para BIGINT, a parte fracionária é truncada. Por exemplo,
CAST(1.6 AS BIGINT) = 1.Ao converter uma STRING no formato DOUBLE para BIGINT, o sistema primeiro a converte para DOUBLE e depois para BIGINT, truncando a parte fracionária. Exemplo:
CAST("1.6" AS BIGINT) = 1.Converta uma STRING no formato BIGINT para DOUBLE. O resultado terá uma casa decimal. Por exemplo,
CAST("1" AS DOUBLE) = 1.0.As conversões para o tipo DATETIME usam o formato padrão
yyyy-mm-dd hh:mi:ss.Use funções integradas para converter alguns tipos de dados que não aceitam conversão explícita direta. Por exemplo, use a função
TO_CHARpara converter um valor BOOLEAN em STRING. Para mais detalhes, consulte TO_CHAR. A funçãoTO_DATEtambém converte valores STRING para DATETIME. Consulte TO_DATE para saber mais.Se o intervalo de valores de um DECIMAL for excedido,
CAST STRING TO DECIMALpoderá causar problemas como erro de estouro ou truncamento de dados.Converter explicitamente DECIMAL para DOUBLE ou FLOAT pode resultar em perda de precisão. Em cenários que exigem alta precisão, como cálculos monetários, use o tipo DECIMAL.
-
O MaxCompute oferece suporte a conversões de tipo para tipos de dados complexos. Tanto nas conversões implícitas quanto nas explícitas de um tipo complexo, os subtipos também devem ser conversíveis. Ao converter um STRUCT, os nomes dos campos não precisam corresponder, mas a quantidade de campos deve ser igual e os campos correspondentes devem ser conversíveis implícita ou explicitamente. Por exemplo:
ARRAY<BIGINT>pode ser convertido implícita ou explicitamente paraARRAY<STRING>.ARRAY<BIGINT>aceita conversão explícita paraARRAY<INT>, mas não permite conversão implícita.Não é possível converter
ARRAY<BIGINT>paraARRAY<DATETIME>nem implícita nem explicitamente.STRUCT<a:BIGINT,b:INT>admite conversão implícita paraSTRUCT<col1:STRING,col2:BIGINT>, porém não pode ser convertido implícita ou explicitamente paraSTRUCT<a:STRING>.
Conversão implícita e seu escopo
A conversão implícita ocorre automaticamente em tempo de execução no MaxCompute, com base no contexto e nas regras de conversão. As tabelas abaixo mostram as conversões implícitas compatíveis.
|
De/Para |
BOOLEAN |
TINYINT |
SMALLINT |
INT |
BIGINT |
FLOAT |
|
BOOLEAN |
N/A |
N |
N |
N |
N |
N |
|
TINYINT |
N |
N/A |
Y |
Y |
Y |
Y |
|
SMALLINT |
N |
N |
N/A |
Y |
Y |
Y |
|
INT |
N |
N |
Y |
N/A |
Y |
Y |
|
BIGINT |
N |
N |
N |
N |
N/A |
Y |
|
FLOAT |
N |
N |
N |
N |
Y |
N/A |
|
De/para |
DOUBLE |
DECIMAL |
STRING |
VARCHAR |
TIMESTAMP |
BINARY |
|
DOUBLE |
N/A |
Y |
Y |
Y |
N |
N |
|
DECIMAL |
N |
N/A |
Y |
Y |
N |
N |
|
STRING |
Y |
Y |
N/A |
Y |
N |
N |
|
VARCHAR |
Y |
Y |
Y |
N/A |
N |
N |
|
TIMESTAMP |
N |
N |
Y |
Y |
N/A |
N |
|
BINARY |
N |
N |
N |
N |
N |
N/A |
Nessas tabelas, Y indica suporte à conversão, N indica falta de suporte e N/A significa que a conversão é desnecessária. O MaxCompute retorna erro caso uma conversão implícita não tenha suporte ou falhe durante a execução.
O MaxCompute 2.0 introduziu definições de constantes para os tipos DECIMAL e DATETIME. Por exemplo, 100BD é uma constante DECIMAL com valor 100, e
2017-11-11 00:00:00é uma constante DATETIME. Use essas constantes diretamente em cláusulas VALUES e tabelas.Como o MaxCompute realiza conversões implícitas automaticamente conforme o contexto, use CAST para conversões explícitas quando houver incompatibilidade de tipos de dados.
As regras de conversão implícita são válidas apenas dentro de um escopo específico. Em certos contextos, aplica-se apenas um subconjunto dessas regras.
Exemplo
SELECT user_id+age+'12345', CONCAT(user_name,user_id,age) FROM user;
As regras de conversão implícita variam conforme o operador:
-
Conversão implícita com operadores relacionais
Os operadores relacionais incluem
=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, LIKE, RLIKE e IN. As regras de conversão implícita paraLIKE, RLIKE e INdiferem das demais e têm descrição separada. As regras desta seção não se aplicam a esses três operadores.Quando tipos de dados diferentes participam de uma operação relacional, eles são convertidos implicitamente seguindo estas regras:
De/para
BIGINT
DOUBLE
STRING
DATETIME
BOOLEAN
DECIMAL
BIGINT
N/A
DOUBLE
DOUBLE
N
N
DECIMAL
DOUBLE
DOUBLE
N/A
DOUBLE
N
N
DECIMAL
STRING
DOUBLE
DOUBLE
N/A
DATETIME
N
DECIMAL
DATETIME
N
N
DATETIME
N/A
N
N
BOOLEAN
N
N
N
N
N/A
N
DECIMAL
DECIMAL
DECIMAL
DECIMAL
N
N
N/A
NotaSe os dois tipos de dados comparados não puderem ser convertidos implicitamente, a operação relacional falhará e retornará um erro.
Para mais informações sobre operadores relacionais, consulte Operators.
-
Conversão implícita com operadores relacionais especiais
Os operadores relacionais especiais incluem
LIKE, RLIKE e IN.-
A sintaxe para LIKE e RLIKE é a seguinte:
source LIKE pattern; source RLIKE pattern;NotaOs parâmetros source e pattern para LIKE e RLIKE devem ser do tipo STRING.
Outros tipos de dados não são permitidos e não serão convertidos implicitamente para STRING nesta operação.
-
A sintaxe para IN é a seguinte:
key IN (value1, value2, …)NotaEm uma expressão IN, todos os valores na lista devem ter o mesmo tipo de dado.
Ao comparar a chave com os valores, se os tipos incluírem BIGINT, DOUBLE e STRING, converta-os todos para DOUBLE. Se incluírem DATETIME e STRING, converta-os todos para DATETIME. Nenhuma outra conversão de tipo é permitida.
-
-
Conversão implícita com operadores aritméticos
Os operadores aritméticos incluem
+, -, *, / e %. Suas regras de conversão implícita são:Apenas os tipos STRING, BIGINT, DOUBLE e DECIMAL podem ser usados em operações aritméticas.
Valores STRING são convertidos implicitamente para DOUBLE antes da operação.
BIGINT é convertido implicitamente para DOUBLE quando usado em cálculos com DOUBLE.
Os tipos DATETIME e BOOLEAN não podem ser utilizados em operações aritméticas.
-
Conversão implícita com operadores lógicos
Os operadores lógicos incluem
and, or e not. Suas regras de conversão implícita são:Somente valores BOOLEAN podem ser usados em operações lógicas.
Outros tipos de dados não são aceitos em operações lógicas e não podem ser convertidos implicitamente para esse fim.
Conversão implícita em funções integradas
O MaxCompute SQL oferece diversas funções integradas para executar cálculos em uma ou mais colunas de qualquer linha e retornar variados tipos de dados. As regras de conversão implícita são:
Ao chamar uma função, se o tipo de dado de um parâmetro de entrada não corresponder ao tipo definido para aquele parâmetro, ele será convertido implicitamente para o tipo necessário.
As regras de conversão implícita variam para cada função integrada do MaxCompute SQL .
Conversão implícita em expressões CASE WHEN
Para mais detalhes sobre expressões CASE WHEN, consulte CASE WHEN expression. As regras de conversão implícita são:
Se os tipos de retorno incluírem apenas BIGINT e DOUBLE, todos serão convertidos para DOUBLE.
Caso algum valor de retorno potencial seja STRING, todos os valores de retorno serão convertidos para STRING. Se um tipo, como BOOLEAN, não puder ser convertido, o sistema retornará um erro.
Outras conversões de tipo não são permitidas.
Conversão entre STRING e DATETIME
O MaxCompute oferece suporte a conversões entre os tipos STRING e DATETIME. O formato yyyy-mm-dd hh:mi:ss é utilizado nessas conversões.
|
Unidade |
String de formato |
Intervalo de valores |
|||
|
Ano |
yyyy |
0001-9999 |
|||
|
Mês |
mm |
01-12 |
|||
|
Dia |
dd |
01-28 |
29 |
30 |
31 |
|
Hora |
hh |
00-23 |
|||
|
Minuto |
mi |
00-59 |
|||
|
Segundo |
ss |
00-59 |
Se o valor de uma unidade tiver apenas um dígito, o zero à esquerda não pode ser omitido. Por exemplo,
2014-1-9 12:12:12é um formato DATETIME inválido e não pode ser convertido de STRING para DATETIME. Escreva-o como2014-01-09 12:12:12.Uma STRING só pode ser convertida para DATETIME se corresponder exatamente ao formato descrito acima. Por exemplo,
CAST("2013-12-31 02:34:34" AS DATETIME)converte a STRING2013-12-31 02:34:34para o tipo DATETIME. Da mesma forma, ao converter um valor DATETIME para STRING, o formato padrão aplicado éyyyy-mm-dd hh:mi:ss.
O MaxCompute fornece a função TO_DATE, que permite converter valores STRING que não correspondem ao formato de data padrão para o tipo DATETIME. Para mais informações, consulte TO_DATE.