Função CAST - Amazon Redshift

Função CAST

A função CAST converte um tipo de dados em outro compatível. Por exemplo, é possível converter uma string em uma data ou um tipo numérico em uma string. CAST executa uma conversão em tempo de execução, o que significa que a conversão não altera o tipo de dados de um valor em uma tabela de origem. Isso é alterado somente no contexto da consulta.

A função CAST é muito semelhante à Função CONVERT, pois ambas convertem um tipo de dado em outro, mas têm nomes diferentes.

Determinados tipos de dados exigem uma conversão explícita para outros tipos de dados usando a função CAST ou CONVERT. Outros tipos de dados podem ser convertidos implicitamente, como parte de outro comando, sem usar CAST ou CONVERT. Consulte Compatibilidade e conversão dos tipos.

Sintaxe

Use uma dessas duas formas equivalentes de sintaxe para transmitir expressões de um tipo de dados para outro.

CAST ( expression AS type ) expression :: type

Argumentos

expressão

Uma expressão que avalia para um ou mais valores, tal como um nome de coluna ou um literal. A conversão de valores nulos retorna nulos. A expressão não pode conter strings em branco ou vazias.

tipo

Um dos Tipos de dados compatíveis.

Tipo de retorno

CAST retorna o tipo de dados especificado pelo argumento type.

nota

O Amazon Redshift retornará um erro se você tentar realizar uma conversão problemática, como uma conversão DECIMAL que perde precisão, como a seguinte:

select 123.456::decimal(2,1);

ou uma conversão INTEGER que causa um transbordamento:

select 12345678::smallint;

Exemplos

Alguns dos exemplos usam o banco de dados TICKIT como exemplo. Para ter mais informações sobre como configurar os dados de exemplo, consulte Carregar dados de amostra.

As seguintes duas consultas são equivalentes. Ambas convertem um valor decimal em um número inteiro:

select cast(pricepaid as integer) from sales where salesid=100; pricepaid ----------- 162 (1 row)
select pricepaid::integer from sales where salesid=100; pricepaid ----------- 162 (1 row)

O seguinte produz um resultado semelhante. Ele não exige dados de exemplo para ser executado:

select cast(162.00 as integer) as pricepaid; pricepaid ----------- 162 (1 row)

Neste exemplo, os valores em uma coluna de carimbo de data/hora são transmitidos como datas, o que resulta na remoção do horário de cada resultado:

select cast(saletime as date), salesid from sales order by salesid limit 10; saletime | salesid -----------+--------- 2008-02-18 | 1 2008-06-06 | 2 2008-06-06 | 3 2008-06-09 | 4 2008-08-31 | 5 2008-07-16 | 6 2008-06-26 | 7 2008-07-10 | 8 2008-07-22 | 9 2008-08-06 | 10 (10 rows)

Se você não usasse CAST conforme ilustrado no exemplo anterior, os resultados incluiriam o horário: 2008-02-18 02:36:48.

A consulta a seguir converte dados de caracteres variáveis em uma data. Ele não exige dados de exemplo para ser executado.

select cast('2008-02-18 02:36:48' as date) as mysaletime; mysaletime -------------------- 2008-02-18 (1 row)

Neste exemplo, os valores em uma coluna de data são convertidos como timestamps:

select cast(caldate as timestamp), dateid from date order by dateid limit 10; caldate | dateid --------------------+-------- 2008-01-01 00:00:00 | 1827 2008-01-02 00:00:00 | 1828 2008-01-03 00:00:00 | 1829 2008-01-04 00:00:00 | 1830 2008-01-05 00:00:00 | 1831 2008-01-06 00:00:00 | 1832 2008-01-07 00:00:00 | 1833 2008-01-08 00:00:00 | 1834 2008-01-09 00:00:00 | 1835 2008-01-10 00:00:00 | 1836 (10 rows)

Em um caso como no exemplo anterior, é possível obter controle adicional sobre a formatação de saída usando TO_CHAR.

Neste exemplo, um número inteiro é convertido como uma string de caracteres:

select cast(2008 as char(4)); bpchar -------- 2008

Neste exemplo, um valor DECIMAL(6,3) é convertido como um valor DECIMAL(4,1):

select cast(109.652 as decimal(4,1)); numeric --------- 109.7

Este exemplo mostra uma expressão mais complexa. A coluna PRICEPAID (uma coluna DECIMAL(8,2)) na tabela SALES é convertida em uma coluna DECIMAL(38,2) e os valores são multiplicados por 100.000.000.000.000.000.000.

select salesid, pricepaid::decimal(38,2)*100000000000000000000 as value from sales where salesid<10 order by salesid; salesid | value ---------+---------------------------- 1 | 72800000000000000000000.00 2 | 7600000000000000000000.00 3 | 35000000000000000000000.00 4 | 17500000000000000000000.00 5 | 15400000000000000000000.00 6 | 39400000000000000000000.00 7 | 78800000000000000000000.00 8 | 19700000000000000000000.00 9 | 59100000000000000000000.00 (9 rows)
nota

Não é possível executar uma operação CAST ou CONVERT no tipo de dados GEOMETRY para alterá-lo para outro tipo de dados. No entanto, você pode fornecer uma representação hexadecimal de uma string literal em formato binário bem-conhecido estendido (EWKB - extended well-known binary) como entrada para funções que aceitam um argumento GEOMETRY. Por exemplo, a função ST_AsText seguinte espera um tipo de dados GEOMETRY.

SELECT ST_AsText('01010000000000000000001C400000000000002040');
st_astext ------------ POINT(7 8)

Também é possível especificar explicitamente o tipo de dados GEOMETRY.

SELECT ST_AsText('010100000000000000000014400000000000001840'::geometry);
st_astext ------------ POINT(5 6)