Categorias:

Funções de conversão

CAST , ::

Converte um valor de um tipo de dados em outro tipo de dados. As semânticas de CAST são as mesmas semânticas das funções de conversão TO_ datatype correspondentes. Se a conversão não for possível, um erro é gerado. Para obter mais detalhes, consulte as funções de conversão individuaisTO_ datatype. Para obter mais informações sobre a conversão de tipo de dados e as funções de conversão TO_ datatype, consulte Conversão do tipo de dados.

O operador :: fornece uma sintaxe alternativa para CAST.

Consulte também:

TRY_CAST

Sintaxe

CAST( <source_expr> AS <target_data_type> )
  [ RENAME FIELDS | ADD FIELDS ]

<source_expr> :: <target_data_type>

Argumentos

source_expr

Expressão de qualquer tipo de dados suportado para ser convertido em um tipo de dados diferente.

target_data_type

O tipo de dados para o qual a expressão deve ser convertida. Se o tipo de dados oferecer suporte a propriedades adicionais, tais como precisão e escala (para números/decimais), as propriedades podem ser incluídas.

RENAME FIELDS

Para OBJECTs estruturados, especifica que você deseja alterar o OBJECT para usar diferentes pares chave-valor. Os valores no objeto original são copiados para os novos pares chave-valor na ordem em que aparecem.

Para obter um exemplo, consulte Exemplo: alteração dos nomes de chave em um valor OBJECT.

ADD FIELDS

Para OBJECTs estruturados, especifica que você deseja adicionar pares chave-valor ao OBJECT.

Para obter um exemplo, consulte Exemplo: adição de chaves a um valor OBJECT.

Os valores das chaves recém-adicionadas serão definidos como NULL. Se você quiser atribuir um valor a essas chaves, chame a função OBJECT_INSERT.

Notas de uso

  • Se a escala não for suficiente para manter o valor de entrada, a função arredonda o valor.

  • Se a precisão não for suficiente para manter o valor de entrada, a função gera um erro.

  • Quando colunas numéricas são explicitamente convertidas em formulários do tipo de dados inteiros durante um descarregamento de dados em arquivos Parquet, o tipo de dados destas colunas nos arquivos Parquet é INT. Para obter mais informações, consulte Converter explicitamente colunas numéricas em tipos de dados Parquet.

  • Collation specifications aren’t retained when values are cast to text string data types (for example, VARCHAR and STRING). You can include collation specifications when you cast values (for example, CAST(myvalue AS VARCHAR) COLLATE 'en-ai').

  • Quando você usa a sintaxe alternativa ::, você não pode especificar os argumentos RENAME FIELDS ou ADD FIELDS.

Exemplos

Os exemplos CAST usam os dados da tabela a seguir:

CREATE OR REPLACE TABLE test_data_type_conversion (
  varchar_value VARCHAR,
  number_value NUMBER(5, 4),
  timestamp_value TIMESTAMP);

INSERT INTO test_data_type_conversion VALUES (
  '9.8765',
  1.2345,
  '2024-05-09 14:32:29.135 -0700');

SELECT * FROM test_data_type_conversion;
+---------------+--------------+-------------------------+
| VARCHAR_VALUE | NUMBER_VALUE | TIMESTAMP_VALUE         |
|---------------+--------------+-------------------------|
| 9.8765        |       1.2345 | 2024-05-09 14:32:29.135 |
+---------------+--------------+-------------------------+

Os exemplos usam a função SYSTEM$TYPEOF para mostrar o tipo de dados do valor convertido.

Converta uma cadeia de caracteres em um número com escala especificada (2):

SELECT CAST(varchar_value AS NUMBER(5,2)) AS varchar_to_number1,
       SYSTEM$TYPEOF(varchar_to_number1) AS data_type
  FROM test_data_type_conversion;
+--------------------+------------------+
| VARCHAR_TO_NUMBER1 | DATA_TYPE        |
|--------------------+------------------|
|               9.88 | NUMBER(5,2)[SB4] |
+--------------------+------------------+

Converta a mesma cadeia de caracteres em número com a escala 5, usando a notação :::

SELECT varchar_value::NUMBER(6,5) AS varchar_to_number2,
       SYSTEM$TYPEOF(varchar_to_number2) AS data_type
  FROM test_data_type_conversion;
+--------------------+------------------+
| VARCHAR_TO_NUMBER2 | DATA_TYPE        |
|--------------------+------------------|
|            9.87650 | NUMBER(6,5)[SB4] |
+--------------------+------------------+

Converta um número em um número inteiro. Para um inteiro, precisão e escala não podem ser especificadas, portanto, o padrão é sempre NUMBER(38, 0).

SELECT CAST(number_value AS INTEGER) AS number_to_integer,
       SYSTEM$TYPEOF(number_to_integer) AS data_type
  FROM test_data_type_conversion;
+-------------------+-------------------+
| NUMBER_TO_INTEGER | DATA_TYPE         |
|-------------------+-------------------|
|                 1 | NUMBER(38,0)[SB1] |
+-------------------+-------------------+

Converta um número em uma cadeia de caracteres:

SELECT CAST(number_value AS VARCHAR) AS number_to_varchar,
       SYSTEM$TYPEOF(number_to_varchar) AS data_type
  FROM test_data_type_conversion;
+-------------------+--------------+
| NUMBER_TO_VARCHAR | DATA_TYPE    |
|-------------------+--------------|
| 1.2345            | VARCHAR[LOB] |
+-------------------+--------------+

Convert a string to a VARCHAR value with a specified length:

SELECT varchar_value,
       SYSTEM$TYPEOF(varchar_value) AS data_type_source,
       CAST(varchar_value AS VARCHAR(9)) AS converted_varchar,
       SYSTEM$TYPEOF(converted_varchar) AS data_type_converted
  FROM test_data_type_conversion;
+---------------+------------------------+-------------------+---------------------+
| VARCHAR_VALUE | DATA_TYPE_SOURCE       | CONVERTED_VARCHAR | DATA_TYPE_CONVERTED |
|---------------+------------------------+-------------------+---------------------|
| 9.8765        | VARCHAR(16777216)[LOB] | 9.8765            | VARCHAR(9)[LOB]     |
+---------------+------------------------+-------------------+---------------------+

If you are casting a value to the VARCHAR type with a specified length and the value exceeds that length, an error is returned:

SELECT CAST(varchar_value AS VARCHAR(4))
  FROM test_data_type_conversion;
100078 (22000): String '9.8765' is too long and would be truncated

Converta um carimbo de data/hora em uma data:

SELECT CAST(timestamp_value AS DATE) AS timestamp_to_date,
       SYSTEM$TYPEOF(timestamp_to_date) AS data_type
  FROM test_data_type_conversion;
+-------------------+-----------+
| TIMESTAMP_TO_DATE | DATA_TYPE |
|-------------------+-----------|
| 2024-05-09        | DATE[SB4] |
+-------------------+-----------+