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.
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_columnpara 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
17para 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_columnpara convertê-lo em FLOAT, de modo que o valor possa ser comparado com o valormy_float_columnusando 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 conforme mostrado no seguinte exemplo:
... height * (width::VARCHAR) ...
Para converter o resultado da expressão height * width, use parênteses conforme mostrado no seguinte exemplo:
SELECT (height * width)::VARCHAR || ' square meters'
FROM dimensions;
Como outro exemplo, considere a seguinte instrução:
SELECT -0.0::FLOAT::BOOLEAN;
O comportamento esperado é que essa instrução seja interpretada conforme mostrado no seguinte exemplo:
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 conforme mostrado no seguinte exemplo:
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 BOOLEAN, o Snowflake chamará 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 e também 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 mais informações 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 |
|||||
✔ |
❌ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Use conversão explícita para conversão. Para obter mais informações, consulte Conversão de vetores. |
|||
BINARY |
|||||
✔ |
❌ |
Nenhum. |
|||
✔ |
❌ |
Nenhum. |
|||
BOOLEAN |
|||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
❌ |
Nenhum. |
|||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
Nenhum. |
|||
DATE |
|||||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
❌ |
Nenhum. |
|||
DECFLOAT . (números decimais de ponto flutuante) |
|||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
FLOAT . (números de ponto flutuante) |
|||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
GEOGRAPHY |
|||||
✔ |
❌ |
Nenhum. |
|||
GEOMETRY |
|||||
✔ |
❌ |
Nenhum. |
|||
NUMBER[(p,s)] . (Números de ponto fixo, incluindo INTEGER) |
|||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
||||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
OBJECT |
|||||
✔ |
❌ |
Nenhum. |
|||
✔ |
❌ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
TIME |
|||||
✔ |
✔ |
Nenhum. |
|||
✔ |
❌ |
Nenhum. |
|||
TIMESTAMP |
|||||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
❌ |
Nenhum. |
|||
VARCHAR |
|||||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
Por exemplo, de |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
❌ |
Nenhum. |
|||
VARIANT |
|||||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Por exemplo, de um VARIANT contendo |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
❌ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
✔ |
Nenhum. |
|||
✔ |
❌ |
O VARIANT deve conter uma ARRAY do tipo FLOAT ou INT. |
|||
VECTOR |
|||||
✔ |
✔ |
Nenhum. |
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 de 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 de 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.
O Snowflake realiza a conversão implícita dos argumentos para torná-los compatíveis. Por exemplo, se uma das expressões de entrada for um tipo numérico, o tipo de retorno também será numérico. Ou seja,
SELECT COALESCE('17', 1);primeiro converte o valor VARCHAR'17'no valor NUMBER17e, em seguida, retorna o primeiro valor não NULL.Quando a conversão não é possível, há uma falha na conversão implícita. Por exemplo,
SELECT COALESCE('foo', 1);retorna um erro porque o valor VARCHAR'foo'não pode ser convertido em um valor NUMBER.Recomendamos passar argumentos do mesmo tipo ou convertê-los explicitamente, se necessário.
Quando a conversão implícita converte um valor não numérico em numérico, o resultado é um valor do 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) em ponto flutuante; por exemplo, FLOAT, poderá 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 ela pode provocar as seguintes situações:
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, a seguinte falha de perda de dígitos:
SELECT 12.3::FLOAT::NUMBER(3,2);
Neste exemplo, o número
12.3tem 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 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 tipos de dados diferentes, 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, o Snowflake escolherá 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 que possa armazenar cada um dos resultados individuais.
Some applications, such as SnowSQL, and some graphical user interfaces, such as Snowsight, apply their own conversion and formatting rules when they display data. For example, SnowSQL displays BINARY values as a string that contains only hexadecimal digits; that string is generated by implicitly calling a conversion function. Therefore, the data that SnowSQL displays might not unambiguously indicate which data conversions that Snowflake coerced.