En comparación con la función CAST, TRY_CAST intenta primero convertir la expresión al tipo especificado. Si la conversión falla debido a errores de conversión, la operación devuelve null. Si una conversión no está permitida explícitamente, la operación devuelve un error. Puede encontrar la lista de posibles conversiones en las notas de uso que figuran a continuación. Por ejemplo, no se permite intentar convertir un booleano en una marca temporal.
Sintaxis
TRY_CAST(expression AS 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. Para obtener una lista completa de los tipos de datos, consulte Tipos de datos. Para obtener la lista de pares de tipos de datos de origen y tipos de datos de destino admitidos, consulte las notas de uso que figuran a continuación.
Tipo de retorno
TRY_CAST devuelve un valor del tipo de datos especificado por el argumento type. Si la conversión falla, la operación devuelve null.
Notas de uso
A continuación, se muestra la lista de pares de tipos de datos de origen y tipos de datos de destino que Amazon Redshift admite para TRY_CAST.
- BOOL
-
SMALLINT, INT, BIGINT, SUPER
- SMALLINT
-
BOOL, INT, BIGINT, DECIMAL, REAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER
- INT
-
BOOL, SMALLINT, BIGINT, DECIMAL, REAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER
- BIGINT
-
BOOL, SMALLINT, INT, DECIMAL, REAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER
- DECIMAL
-
SMALLINT, INT, BIGINT, REAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER
- REAL
-
SMALLINT, INT, BIGINT, DECIMAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER
- FLOAT
-
SMALLINT, INT, BIGINT, DECIMAL, REAL, BPCHAR, TEXT, VARCHAR, SUPER
- BPCHAR
-
SMALLINT, INT, BIGINT, DECIMAL, REAL, FLOAT, TEXT, VARCHAR, TIMESTAMP, TIMESTAMPTZ, DATE, TIME, TIMETZ, SUPER
- TEXT
-
SMALLINT, INT, BIGINT, DECIMAL, REAL, FLOAT, BPCHAR, VARCHAR, TIMESTAMP, TIMESTAMPTZ, DATE, TIME, TIMETZ, SUPER
- VARCHAR
-
SMALLINT, INT, BIGINT, DECIMAL, REAL, FLOAT, BPCHAR, TEXT, TIMESTAMP, TIMESTAMPTZ, DATE, TIME, TIMETZ, SUPER
- TIMESTAMP
-
BPCHAR, TEXT, VARCHAR, TIMESTAMPTZ, DATE, TIME
- TIMESTAMPTZ
-
BPCHAR, TEXT, VARCHAR, TIMESTAMP, DATE, TIME, TIMETZ
- DATE
-
BPCHAR, TEXT, VARCHAR, TIMESTAMP, TIMESTAMPTZ
- TIME
-
BPCHAR, TEXT, VARCHAR
- TIMETZ
-
BPCHAR, TEXT, VARCHAR
- SUPER
-
SUPER se puede convertir a cualquier otro tipo de datos, con la excepción de DATE, TIME, TIMETZ, TIMESTAMP y TIMESTAMPTZ.
Ejemplos
El siguiente ejemplo convierte un STRING en un INTEGER.
SELECT TRY_CAST('123' AS INT);
int ---- 123
El ejemplo siguiente devuelve null. Se permite convertir un STRING en un INTEGER, por lo que TRY_CAST no devuelve un error, pero “foo” no es un entero, por lo que la función devuelve null.
SELECT TRY_CAST('foo' AS INT)
El siguiente ejemplo devuelve un error, porque no se permite convertir un BOOLEAN en un TIMESTAMP.
SELECT TRY_CAST(true as timestamp);
Debido a que TRY_CAST devuelve un valor nulo en lugar de devolver inmediatamente un error si la conversión falla, puede utilizar TRY_CAST para filtrar datos no válidos. Considere el siguiente ejemplo, en el que se filtra una fila no válida debido a un error de conversión en la columna de edad de Akua Mansa.
CREATE TABLE IF NOT EXISTS student_data(
name VARCHAR(100) NOT NULL,
age VARCHAR(3) NOT NULL,
enrollment_date DATE NOT NULL);
INSERT INTO student_data (name, age, enrollment_date)
VALUES
('Alejandro Rosalez', '10', '01/01/2000'),
('Akua Mansa', 'Ten', '01/01/2000');
SELECT * FROM student_data WHERE TRY_CAST(age AS INT) IS NOT NULL;
--Akua is not returned.
name | age | enrollment_date
-------------------+-----+-----------------
Alejandro Rosalez | 10 | 01/01/2000