Conversão do tipo de dados¶
Em muitos casos, um valor de um tipo de dados pode ser convertido em outro tipo de dados. Por exemplo, um valor INTEGER pode ser convertido em um valor do tipo de dados de ponto flutuante. A conversão de um tipo de dados é chamada de conversão.
Neste tópico:
Conversão explícita vs. conversão implícita¶
Os usuários podem converter explicitamente um valor de um tipo de dados em outro. Isto é chamado de conversão explícita.
Em algumas situações, o Snowflake converte automaticamente um valor em outro tipo de dados. Isto é chamado de conversão implícita ou coerção.
Conversão explícita¶
Os usuários podem converter um valor explicitamente usando qualquer uma das seguintes opções:
A função CAST.
O operador
::
(chamado de operador de conversão).A função SQL apropriada (por exemplo, TO_DOUBLE).
Por exemplo, cada consulta converte um valor de cadeia de caracteres em um valor de DATE:
SELECT CAST('2022-04-01' AS DATE); SELECT '2022-04-01'::DATE; SELECT TO_DATE('2022-04-01');
A conversão é permitida na maioria dos contextos nos quais uma expressão geral é permitida, incluindo a cláusula WHERE. Por exemplo:
SELECT date_column FROM log_table WHERE date_column >= '2022-04-01'::DATE;
Conversão implícita (coerção)¶
A coerção ocorre quando uma função (ou operador) requer um tipo de dados diferente, mas compatível com os argumentos (ou operandos).
Exemplos para funções ou procedimentos armazenados:
O seguinte código aplica a coerção ao valor INTEGER na coluna
my_integer_column
para convertê-lo em FLOAT, de modo que o valor possa ser passado para a funçãomy_float_function()
, que espera um FLOAT:SELECT my_float_function(my_integer_column) FROM my_table;
Exemplos para operadores:
O código a seguir aplica a coerção ao valor INTEGER
17
para convertê-lo em VARCHAR, de modo que os valores possam ser concatenados usando o operador||
:SELECT 17 || '76';
O resultado dessa instrução SELECT é a cadeia de caracteres
'1776'
.A seguinte instrução aplica coerção ao valor INTEGER na coluna
my_integer_column
para convertê-lo em FLOAT, de modo que o valor possa ser comparado com o valormy_float_column
usando o operador de comparação<
:SELECT ... FROM my_table WHERE my_integer_column < my_float_column;
Nem todos os contextos (por exemplo, nem todos os operadores) oferecem suporte à coerção.
Conversão e precedência¶
Ao converter dentro de uma expressão, o código deve levar em conta a precedência do operador de conversão em relação aos outros operadores da expressão.
Considere o seguinte exemplo:
SELECT height * width::VARCHAR || ' square meters'
FROM dimensions;
O operador de conversão tem maior precedência do que o operador aritmético *
(multiplicar), portanto a instrução é interpretada como:
... height * (width::VARCHAR) ...
Para converter o resultado da expressão height * width
, use parênteses, como mostrado abaixo:
SELECT (height * width)::VARCHAR || ' square meters'
FROM dimensions;
Como outro exemplo, considere a seguinte instrução:
SELECT -0.0::FLOAT::BOOLEAN;
É de se esperar que isto seja interpretado como:
SELECT (-0.0::FLOAT)::BOOLEAN;
Portanto, espera-se que ele retorne FALSE (0 = FALSE, 1 = TRUE).
Entretanto, o operador de conversão tem maior precedência do que o operador de menos unário (negação), portanto, a instrução é interpretada como:
SELECT -(0.0::FLOAT::BOOLEAN);
Portanto, a consulta resulta em uma mensagem de erro porque o sinal de menos unário não pode ser aplicado a um BOOLEAN.
Tipos de dados que podem ser convertidos¶
A tabela a seguir mostra as conversões de tipo de dados válidas no Snowflake. A tabela também mostra quais coerções o Snowflake pode executar automaticamente.
Nota
Internamente, a função CAST e o operador ::
chamam a função de conversão apropriada. Por exemplo, se você converter um NUMBER em um BOOLEAN, o Snowflake chama a função TO_BOOLEAN. As notas de uso de cada função de conversão se aplicam quando a função é chamada indiretamente usando uma conversão, bem como quando a função é chamada diretamente. Por exemplo, se você executar CAST(my_decimal_column AS BOOLEAN)
, as regras para chamar TO_BOOLEAN com um valor DECIMAL se aplicam. Por conveniência, a tabela inclui links para as funções de conversão relevantes.
Para obter detalhes sobre conversões entre tipos semiestruturados e tipos estruturados, consulte Conversão de tipos estruturados e semiestruturados.
Tipo de dados de origem |
Tipo de dados de destino |
Conversível |
Coercível |
Função de conversão |
Notas |
---|---|---|---|---|---|
ARRAY |
|||||
✔ |
❌ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
BINARY |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
BOOLEAN |
|||||
✔ |
❌ |
||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
||||
DATE |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
FLOAT . (números de ponto flutuante) |
|||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
GEOGRAPHY |
|||||
✔ |
❌ |
||||
GEOMETRY |
|||||
✔ |
❌ |
||||
NUMBER[(p,s)] . (Números de ponto fixo, incluindo INTEGER) |
|||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
OBJECT |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
✔ |
✔ |
||||
TIME |
|||||
✔ |
✔ |
||||
✔ |
❌ |
||||
TIMESTAMP |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
VARCHAR |
|||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
VARIANT |
|||||
✔ |
✔ |
||||
✔ |
✔ |
Por exemplo, de um VARIANT contendo |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
O VARIANT deve conter uma ARRAY do tipo FLOAT ou INT. |
|||
VECTOR |
|||||
✔ |
✔ |
Nota
Para cada tipo de dados listado (por exemplo, FLOAT), as regras se aplicam a todos os aliases desse tipo de dados (por exemplo, as regras para FLOAT se aplicam a DOUBLE, que é um alias para FLOAT).
Notas de uso¶
Exceto onde indicado de outra forma, as seguintes regras se aplicam tanto para conversão explícita quanto para conversão implícita:
A conversão depende não apenas do tipo de dados, mas também do valor da fonte. Por exemplo:
O valor VARCHAR
'123'
pode ser convertido em um valor numérico, mas o valor VARCHAR'xyz'
não pode ser convertido em um valor numérico.A capacidade de converter um valor específico do tipo VARIANT depende do tipo de dados dentro do VARIANT. Por exemplo, se VARIANT contiver um valor do tipo TIME, não será possível converter o valor VARIANT em um valor TIMESTAMP, pois não é possível converter um valor TIME em um valor TIMESTAMP.
Se possível, passe em argumentos do mesmo tipo. Evite passar em argumentos de diferentes tipos.
Se um dos argumentos for um número, a função converte os argumentos de cadeia de caracteres não numérica (por exemplo,
'a string'
) e os argumentos de cadeia de caracteres que não sejam constantes para o tipo NUMBER(18,5).Para argumentos de cadeia de caracteres numérica que não sejam constantes, se NUMBER(18,5) não for suficiente para representar o valor numérico, então converta o argumento para um tipo que possa representar o valor.
Para alguns pares de tipos de dados, a conversão pode resultar em perda de precisão. Por exemplo:
A conversão de um valor FLOAT em um valor INTEGER arredonda o valor.
A conversão de um valor numérico de ponto fixo (por exemplo, NUMBER(38, 0)) para ponto flutuante (por exemplo, FLOAT) pode resultar em arredondamento ou truncamento se o número de ponto fixo não puder ser representado com precisão em um número de ponto flutuante.
A conversão de um valor TIMESTAMP em um valor DATE remove as informações sobre a hora do dia.
Embora o Snowflake converta os valores em algumas situações em que pode ocorrer a perda de precisão, o Snowflake não permite a conversão em outras situações em que ocorreria uma perda de precisão. Por exemplo, o Snowflake não permite a conversão quando a conversão é permitida:
Trunca um valor VARCHAR. Por exemplo, o Snowflake não converte VARCHAR(10) para VARCHAR(5), nem implícita nem explicitamente.
Resulta na perda de dígitos, exceto dígitos menos significativos. Por exemplo, o seguinte apresenta falha:
SELECT 12.3::FLOAT::NUMBER(3,2);
Neste exemplo, o número
12.3
tem dois dígitos antes do ponto decimal, mas o tipo de dadosNUMBER(3,2)
tem espaço para apenas um dígito antes do ponto decimal.
Ao converter de um tipo com menos precisão em um tipo com mais precisão, a conversão utiliza valores padrão. Por exemplo, a conversão de um valor DATE em um valor TIMESTAMP_NTZ faz com que a hora, o minuto, o segundo e os segundos fracionários sejam definidos como
0
.Quando um valor FLOAT é convertido em um valor VARCHAR, os zeros finais são omitidos.
Por exemplo, as instruções a seguir criam uma tabela e inserem uma linha com um valor VARCHAR, um valor FLOAT e um valor VARIANT. O valor VARIANT é construído a partir de JSON, que contém um valor de ponto flutuante representado com zeros finais.
CREATE OR REPLACE TABLE convert_test_zeros ( varchar1 VARCHAR, float1 FLOAT, variant1 VARIANT); INSERT INTO convert_test_zeros SELECT '5.000', 5.000, PARSE_JSON('{"Loan Number": 5.000}');
A instrução SELECT a seguir converte explicitamente tanto a coluna FLOAT como o valor FLOAT dentro da coluna VARIANT em VARCHAR. Em cada caso, o VARCHAR não contém zeros finais:
SELECT varchar1, float1::VARCHAR, variant1:"Loan Number"::VARCHAR FROM convert_test_zeros;
+----------+-----------------+---------------------------------+ | VARCHAR1 | FLOAT1::VARCHAR | VARIANT1:"LOAN NUMBER"::VARCHAR | |----------+-----------------+---------------------------------| | 5.000 | 5 | 5 | +----------+-----------------+---------------------------------+
Algumas operações podem retornar diferentes tipos de dados, dependendo de uma expressão condicional. Por exemplo, as seguintes chamadas IFNULL retornam tipos de dados ligeiramente diferentes, dependendo dos valores de entrada:
SELECT SYSTEM$TYPEOF(IFNULL(12.3, 0)), SYSTEM$TYPEOF(IFNULL(NULL, 0));
+--------------------------------+--------------------------------+ | SYSTEM$TYPEOF(IFNULL(12.3, 0)) | SYSTEM$TYPEOF(IFNULL(NULL, 0)) | |--------------------------------+--------------------------------| | NUMBER(3,1)[SB1] | NUMBER(1,0)[SB1] | +--------------------------------+--------------------------------+
Se a expressão tiver mais de um tipo de dados possível, então o Snowflake escolhe o tipo de dados com base no resultado real. Para obter mais informações sobre precisão e escala nos cálculos, consulte Escala e precisão em operações aritméticas. Se a consulta gerar mais de um resultado (por exemplo, várias linhas de resultados), o Snowflake escolherá um tipo de dados capaz de conter cada um dos resultados individuais.
Alguns programas de aplicativo, como o SnowSQL, e algumas interfaces gráficas de usuário, como o Classic Console, aplicam suas próprias regras de conversão e formatação ao exibir dados. Por exemplo, o SnowSQL exibe valores BINARY como uma cadeia de caracteres que contém apenas dígitos hexadecimais; essa cadeia é gerada pela chamada implícita de uma função de conversão. Portanto, os dados que o SnowSQL exibe podem não indicar inequivocamente a quais conversões de dados o Snowflake aplicou coerção.