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)