Funzione CAST

CAST è una funzione complessa che converte uno o più valori da un tipo di dati ad un altro.

SINTASSI

Nota: In pratica, non è possibile specificare contemporaneamente tutti i parametri sopra riportati. Ad esempio, le espressioni CCSID e ENCODING hanno effetto solo nelle conversioni da stringa a stringa, mentre FORMAT è valida solo per le conversioni stringa-numerica e stringa-data/ora (e viceversa).

CAST converte uno o più valori da un tipo di dati ad un altro tipo di dati. Ad esempio, è possibile utilizzare CASE per elaborare messaggi XML generici. Tutti i campi in un messaggio XML hanno valori character, per cui se, ad esempio, si desidera eseguire un calcolo aritmetico oppure un confronto data/ora su un campo, è possibile utilizzare CAST per convertire il valore stringa del campo in un valore del tipo appropriato.

Non sono supportate tutte le conversioni; per un elenco delle conversioni supportate, consultare Funzioni CAST supportate.

Parametri

Espressione di origine

CAST restituisce il proprio primo parametro (source_expression), che può contenere più di un valore, come tipo di dati specificato dal proprio secondo parametro (DataType). In tutti i casi, se l'espressione di origine è NULL, il risultato è NULL. Se l'espressione di origine valutata non è compatibile con il tipo di dati della destinazione oppure se l'espressione di origine è nel formato errato, viene generato un errore di runtime.

CCSID

La clausola CCSID viene utilizzata solo per le conversioni in o da uno dei tipi di dati stringa. Consente di specificare la code page dell'origine o la stringa di destinazione.

L'espressione CCSID può essere qualsiasi espressione che ha come risultato un valore di tipo INT. Viene interpretata in base alle normali regole WebSphere Message Broker per CCSID. Per un elenco dei valori validi, consultare Code page supportate.

DataType

DataType è il tipo di dati in cui deve essere convertito il valore di origine. I possibili valori sono:
  • Tipi di stringa:
    • BIT
    • BLOB
    • CHARACTER
  • Tipi numerici:
    • DECIMAL
    • FLOAT
    • INTEGER
  • Tipi di data/ora:
    • DATE
    • GMTTIME
    • GMTTIMESTAMP
    • INTERVAL
    • TIME
    • TIMESTAMP
  • Booleano:
    • BOOLEAN

DEFAULT

La clausola DEFAULT fornisce un metodo che impedisce la generazione di eccezioni dalle istruzioni CAST, fornendo un valore da restituire come ultima risorsa.

L'espressione DEFAULT expression deve essere un'espressione ESQL valida che restituisce lo stesso tipo di dati specificato nel parametro DataType; in caso contrario, viene generata un'eccezione.

I parametri CCSID, ENCODING e FORMAT non vengono applicati al risultato dell'espressione DEFAULT; per questo motivo, l'espressione deve essere di tipo CCSID, ENCODING e FORMAT corretto.

ENCODING

La clausola ENCODING consente di specificare la codifica. Viene utilizzata solo per alcune conversioni. Il valore ENCODING può essere qualsiasi espressione che ha come risultato un valore di tipo INT. Viene interpretata in base alle normali regole WebSphere Message Broker per la codifica. I valori validi sono:
  • MQENC_NATIVE (0x00000222L)
  • MQENC_INTEGER_NORMAL (0x00000001L)
  • MQENC_INTEGER_REVERSED (0x00000002L)
  • MQENC_DECIMAL_NORMAL (0x00000010L)
  • MQENC_DECIMAL_REVERSED (0x00000020L)
  • MQENC_FLOAT_IEEE_NORMAL (0x00000100L)
  • MQENC_FLOAT_IEEE_REVERSED (0x00000200L)
  • MQENC_FLOAT_S390 (0x00000300L)

FORMAT

Per le conversioni tra tipi di dati stringa e tipi di dati numerici o di data/ora, è possibile fornire un'espressione FORMAT facoltativa. Per le conversioni da tipi stringa, FORMAT definisce il modo in cui la stringa di origine deve essere analizzata per soddisfare il tipo di dati di destinazione. Per le conversioni in tipi stringa, definisce il modo in cui i dati nell'espressione di origine devono essere formattati nella stringa di destinazione.

FORMAT utilizza diversi tipi di espressione per le conversioni data/ora e numeriche. Tuttavia, è possibile utilizzare la stessa espressione FORMAT indipendentemente dal fatto che la conversione sia in una stringa o da una stringa.

E' possibile specificare un'espressione FORMAT quando si esegue la conversione:
  • Da uno dei tipi di dati stringa (BIT, BLOB o CHARACTER) in:
    • DECIMAL
    • FLOAT
    • INTEGER
    • DATE
    • GMTTIMESTAMP
    • TIMESTAMP
    • GMTTIME
    • TIME
  • In uno dei tipi di dati stringa (BIT, BLOB o CHARACTER) da uno dei tipi di dati numerici o di data/ora elencati al punto precedente.
Se si specifica FORMAT per una combinazione non supportata di tipi di dati di origine e destinazione, viene visualizzato il messaggio di errore BIP3205.

Per ulteriori informazioni relative alla conversione in e da tipi di dati numerici, consultare Formattazione ed analisi dei numeri come stringhe. Per ulteriori informazioni relative alla conversione in e da tipi di dati di data/ora, consultare Formattazione ed analisi di dateTimes come stringhe.

L'espressione FORMAT è equivalente a quelle utilizzate in molti altri prodotti, come, ad esempio, ICU e Microsoft Excel.

Esempi

Esempio 1. CAST formattata da DECIMAL a CHARACTER

DECLARE source DECIMAL 31415.92653589;
DECLARE target CHARACTER;
DECLARE pattern CHARACTER '#,##0.00';
SET target = CAST(source AS CHARACTER FORMAT pattern);
-- target is now "31,415.93"

Esempio 2. CAST formattata da DATE a CHARACTER

DECLARE now CHARACTER = CAST(CURRENT_TIMESTAMP AS CHARACTER 
                        FORMAT "yyyyMMdd-HHmmss");
-- target is now "20041007-111656" (in this instance at least)

Esempio 3. CAST formattata da CHARACTER a DATE

DECLARE source CHARACTER '01-02-03';
DECLARE target DATE;
DECLARE pattern CHARACTER 'dd-MM-yy';
SET target = CAST(source AS DATE FORMAT pattern);
-- target now contains Year=2003, Month=02, Day=01

Esempio 4. CAST formattata da CHARACTER a TIMESTAMP

DECLARE source CHARACTER '12 Jan 03, 3:45pm';
DECLARE target TIMESTAMP;
DECLARE pattern CHARACTER 'dd MMM yy, h:mma';
SET target = CAST(source AS TIMESTAMP FORMAT pattern);
-- target now contains Year=2003, Month=01, Day=03, Hour=15, Minute=45,
                       Seconds=58 
-- (seconds taken from CURRENT_TIME since not present in input)

Esempio 5. CAST formattata da DECIMAL a CHARACTER, con modello negativo

DECLARE source DECIMAL -54231.122;
DECLARE target CHARACTER;
DECLARE pattern CHARACTER '#,##0.00;(#,##0.00)';
SET target = CAST(source AS CHARACTER FORMAT pattern);
-- target is now "£(54,231.12)"

Esempio 6. CAST formattata da CHARACTER a TIME

DECLARE source CHARACTER '16:18:30';
DECLARE target TIME;
DECLARE pattern CHARACTER 'hh:mm:ss';
SET target = CAST(source AS TIME FORMAT pattern);
-- target now contains  Hour=16, Minute=18, Seconds=30

Esempio 7. CAST da tipi numerici a DATE

CAST(7, 6, 5 AS DATE);
CAST(7.4e0, 6.5e0, 5.6e0 AS DATE);
CAST(7.6, 6.51, 5.4 AS DATE);

Esempio 8. CAST da tipi numerici a TIME

CAST(9, 8, 7 AS TIME);
CAST(9.4e0, 8.6e0, 7.1234567e0 AS TIME);
CAST(9.6, 8.4, 7.7654321 AS TIME);

Esempio 9. CAST da tipi numerici a GMTTIME

CAST(DATE '0001-02-03', TIME '04:05:06' AS TIMESTAMP);
CAST(2, 3, 4, 5, 6, 7.8 AS TIMESTAMP);

Esempio 10. CAST in TIMESTAMP

CAST(DATE '0001-02-03', TIME '04:05:06' AS TIMESTAMP);
CAST(2, 3, 4, 5, 6, 7.8 AS TIMESTAMP);

Esempio 11. CAST in GMTTIMESTAMP

CAST(DATE '0002-03-04', GMTTIME '05:06:07' AS GMTTIMESTAMP);
CAST(3, 4, 5, 6, 7, 8 AS GMTTIMESTAMP);
CAST(3.1e0, 4.2e0, 5.3e0, 6.4e0, 7.5e0, 8.6789012e0 AS GMTTIMESTAMP);
CAST(3.2, 4.3, 5.4, 6.5, 7.6, 8.7890135 AS GMTTIMESTAMP);

Esempio 12. CAST in INTERVAL da INTEGER

CAST(1234 AS INTERVAL YEAR);
CAST(32, 10 AS INTERVAL YEAR   TO MONTH );
CAST(33, 11 AS INTERVAL DAY    TO HOUR  );
CAST(34, 12 AS INTERVAL HOUR   TO MINUTE);
CAST(35, 13 AS INTERVAL MINUTE TO SECOND);
CAST(36, 14, 10  AS INTERVAL DAY  TO MINUTE);
CAST(37, 15, 11  AS INTERVAL HOUR TO SECOND);
CAST(38, 16, 12, 10 AS INTERVAL DAY TO SECOND);

Esempio 13. CAST in INTERVAL da FLOAT

CAST(2345.67e0   AS INTERVAL YEAR  );
CAST(3456.78e1   AS INTERVAL MONTH );
CAST(4567.89e2   AS INTERVAL DAY   );
CAST(5678.90e3   AS INTERVAL HOUR  );
CAST(6789.01e4   AS INTERVAL MINUTE);
CAST(7890.12e5   AS INTERVAL SECOND);
CAST(7890.1234e0 AS INTERVAL SECOND);

Esempio 14. CAST in INTERVAL da DECIMAL

CAST(2345.67   AS INTERVAL YEAR  );
CAST(34567.8   AS INTERVAL MONTH );
CAST(456789    AS INTERVAL DAY   );
CAST(5678900   AS INTERVAL HOUR  );
CAST(67890100  AS INTERVAL MINUTE);
CAST(789012000 AS INTERVAL SECOND);
CAST(7890.1234 AS INTERVAL SECOND);

Esempio 15. CAST in FLOAT da INTERVAL

CAST(INTERVAL '1234' YEAR   AS FLOAT);
CAST(INTERVAL '2345' MONTH  AS FLOAT);
CAST(INTERVAL '3456' DAY    AS FLOAT);
CAST(INTERVAL '4567' HOUR   AS FLOAT);
CAST(INTERVAL '5678' MINUTE AS FLOAT);
CAST(INTERVAL '6789.01' SECOND AS FLOAT);

Esempio 16. CAST in DECIMAL da INTERVAL

CAST(INTERVAL '1234' YEAR   AS DECIMAL);
CAST(INTERVAL '2345' MONTH  AS DECIMAL);
CAST(INTERVAL '3456' DAY    AS DECIMAL);
CAST(INTERVAL '4567' HOUR   AS DECIMAL);
CAST(INTERVAL '5678' MINUTE AS DECIMAL);
CAST(INTERVAL '6789.01' SECOND AS DECIMAL);

Esempio 17. Conversione ternaria che non riesce e fornisce come risultato la sostituzione di un valore predefinito

CAST(7, 6, 32 AS DATE DEFAULT DATE '1947-10-24');

Esempio 18. Conversione di una sestina che non riesce e fornisce come risultato la sostituzione di un valore predefinito

CAST(2, 3, 4, 24, 6, 7.8 AS TIMESTAMP DEFAULT TIMESTAMP '1947-10-24 07:08:09');

Esempio 19. Conversione ternaria che non riesce e genera un'eccezione

BEGIN
  DECLARE EXIT HANDLER FOR SQLSTATE LIKE '%' BEGIN
    SET OutputRoot.XML.Data.Date.FromIntegersInvalidCast = 'Exception thrown';
    END;

  DECLARE Dummy CHARACTER CAST(7, 6, 32 AS DATE);
  END;

Esempio 20. Conversione di una sestina che non riesce e genera un'eccezione

BEGIN
  DECLARE EXIT HANDLER FOR SQLSTATE LIKE '%' BEGIN
    SET OutputRoot.XML.Data.Timestamp.FromIntegersInvalidCast = 'Exception thrown';
    END;

  DECLARE Dummy CHARACTER CAST(2, 3, 4, 24, 6, 7.8 AS TIMESTAMP);
  END;
Concetti correlati
Panoramica di ESQL
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ak05610_