Función CAST
La función CAST convierte un tipo de datos en otro tipo compatible. Por ejemplo, puede convertir una cadena en una fecha o un tipo numérico en una cadena. CAST realiza una conversión en tiempo de ejecución, lo que significa que la conversión no cambia el tipo de datos de un valor en una tabla de origen. Solo cambia en el contexto de la consulta.
La función CAST es muy similar a Función CONVERT, ya que ambas convierten un tipo de datos a otro, pero tienen nombres distintos.
Algunas tipos de datos requieren una conversión explícita a otros tipos de datos utilizando las funciones CAST o CONVERT. Otros tipos de datos se pueden convertir implícitamente, como parte de otro comando, sin utilizar CAST ni CONVERT. Consulte Conversión y compatibilidad de tipos.
Sintaxis
Utilice cualquiera de estas dos formas sintácticas equivalentes para convertir expresiones de un tipo de datos a otro.
CAST ( expression AS type ) expression :: type
Argumentos
- expresión
-
Una expresión que toma el valor de uno o más valores, como un nombre de columna o un literal. La conversión de valores nulos devuelve valores nulos. La expresión no puede tener cadenas en blanco ni vacías.
- type
-
Uno de los Tipos de datos admitidos.
Tipo de retorno
CAST devuelve el tipo de datos especificado por el argumento type.
nota
Amazon Redshift devuelve un error si intenta realizar una conversión problemática, como una conversión DECIMAL que pierde precisión, como la siguiente:
select 123.456::decimal(2,1);
o una conversión a un valor de INTEGER que genera un desbordamiento:
select 12345678::smallint;
Ejemplos
Algunos de los ejemplos utilizan la base de datos de muestra TICKIT. Para obtener más información acerca de cómo configurar datos de ejemplo, consulte Cargar datos.
Las siguientes dos consultas son equivalentes. Ambas convierten un valor decimal en uno entero:
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)
Lo siguiente produce un resultado similar. No requiere datos de muestra para ejecutarse:
select cast(162.00 as integer) as pricepaid;
pricepaid ----------- 162 (1 row)
En este ejemplo, los valores de una columna de marca temporal se convierten en fechas, lo que elimina la hora 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)
Si no utilizara CAST como se ilustra en el ejemplo anterior, los resultados incluirían la hora: 2008-02-18 02:36:48.
La siguiente consulta convierte los datos de caracteres variables en una fecha. No requiere datos de muestra para ejecutarse.
select cast('2008-02-18 02:36:48' as date) as mysaletime;
mysaletime -------------------- 2008-02-18 (1 row)
En este ejemplo, los valores en una columna de fecha se convierten en marcas temporales:
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)
En un caso como el del ejemplo anterior, puede obtener control adicional sobre el formato de salida si utiliza TO_CHAR.
En este ejemplo, un valor entero se convierte en una cadena de caracteres:
select cast(2008 as char(4));
bpchar -------- 2008
En este ejemplo, un valor DECIMAL (6,3) se convierte en un valor DECIMAL (4,1):
select cast(109.652 as decimal(4,1));
numeric --------- 109.7
Este ejemplo muestra una expresión más compleja. La columna PRICEPAID (una columna DECIMAL(8,2)) de la tabla SALES se convierte en una columna DECIMAL(38,2) y los valores se multiplican por 100000000000000000000:
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
No puede realizar una operación de CAST o CONVERTER en un tipo de datos GEOMETRY
para cambiarlo a otro tipo de datos. No obstante, puede proporcionar una representación hexadecimal de una cadena literal en un formato extendido de binario conocido (EWKB) como entrada a las funciones que aceptan un argumento GEOMETRY
. Por ejemplo, la función ST_AsText
siguiente espera un tipo de datos GEOMETRY
.
SELECT ST_AsText('01010000000000000000001C400000000000002040');
st_astext ------------ POINT(7 8)
También puede especificar explícitamente el tipo de datos GEOMETRY
.
SELECT ST_AsText('010100000000000000000014400000000000001840'::geometry);
st_astext ------------ POINT(5 6)