Funzione TRY_CAST - Amazon Redshift

Amazon Redshift non supporterà più la creazione di nuove UDF Python a partire dal 1º novembre 2025. Se desideri utilizzare le UDF Python, creale prima di tale data. Le UDF Python esistenti continueranno a funzionare normalmente. Per ulteriori informazioni, consulta il post del blog.

Funzione TRY_CAST

Rispetto alla funzione CAST, TRY_CAST tenta innanzitutto di eseguire il cast dell’espressione per il tipo specificato. Se il cast non riesce a causa di errori di conversione, l’operazione restituisce null. Se una conversione non è esplicitamente consentita, l’operazione restituisce un errore. Puoi trovare l’elenco delle possibili conversioni nelle note per l’utilizzo riportate di seguito. Ad esempio, il tentativo di convertire un booleano in un timestamp non è consentito.

Sintassi

TRY_CAST(expression AS type)

Argomenti

Espressione

Un'espressione che valuta uno o più valori, ad esempio un nome di colonna o un letterale. La conversione di valori null restituisce null. L'espressione non può contenere stringhe o spazi vuoti.

tipo

Uno dei tipi di dati supportati. Per l’elenco completo dei tipi di dati, consulta Tipi di dati. Per l’elenco delle coppie di tipi di dati di origine e tipi di dati di destinazione supportate, consulta le note per l’utilizzo riportate di seguito.

Tipo restituito

TRY_CAST restituisce un valore per il tipo di dati specificato dall’argomento type. Se la conversione non riesce, l’operazione restituisce null.

Note per l’utilizzo

Di seguito è riportato l’elenco delle coppie di tipi di dati di origine e tipi di dati di destinazione supportate da Amazon Redshift per 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 può essere convertito in qualsiasi altro tipo di dati, a eccezione di DATE, TIME, TIMETZ, TIMESTAMP e TIMESTAMPTZ.

Esempi

L’esempio seguente esegue il cast di una STRINGA in un NUMERO INTERO.

SELECT TRY_CAST('123' AS INT); int ---- 123

Il seguente esempio restituisce null. La conversione di una STRINGA in un NUMERO INTERO è consentita, quindi TRY_CAST non restituisce un errore. Tuttavia 'foo' non è un numero intero, quindi la funzione restituisce null.

SELECT TRY_CAST('foo' AS INT)

L’esempio seguente restituisce un errore perché la conversione di un BOOLEANO in un TIMESTAMP non è consentita.

SELECT TRY_CAST(true as timestamp);

Poiché TRY_CAST restituisce null anziché restituire immediatamente un errore in caso di mancata conversione, puoi utilizzare TRY_CAST per filtrare i dati non validi. Considera l’esempio seguente, in cui una riga non valida viene filtrata a causa di un errore di conversione nella colonna dell’età per 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