Función CAST

CAST es una función compleja que transforma uno o más valores de un tipo de datos a otro.

Sintaxis

Diagrama de sintaxis de lecturaOmitir diagrama de sintaxis visualCAST( << , <<expresión_origen asTipo de datosCCSIDexpresiónENCODINGexpresiónFormatoexpresiónValor predeterminadoexpresión)

En la práctica, no puede especificar todos los parámetros anteriores al mismo tiempo. Por ejemplo, los parámetros CCSID y ENCODING sólo tienen efecto en conversiones serie de caracteres a serie de caracteres, mientras que FORMAT sólo se aplica a conversiones serie de caracteres-numérico y serie de caracteres-fechayhora (en ambas direcciones).

No todas las conversiones están soportadas; consulte Conversiones soportadas para obtener una lista de conversiones soportadas.

Parámetros

Expresión de origen

CAST devuelve su primer parámetro (expresión_origen), que puede contener más de un valor, como el tipo-datos especificado por su segundo parámetro (TipoDatos). En todos los casos, si la expresión de origen es NULL, el resultado es NULL. Si la expresión de origen evaluada no es compatible con el tipo de datos de destino o si la expresión de origen tiene un formato incorrecto, se genera un error en tiempo de ejecución.

CCSID

El parámetro CCSID sólo se utiliza en conversiones a o de uno de los tipos de datos de serie de caracteres. Utilice el parámetro CCSID para especificar la página de códigos de la serie de caracteres de origen o de destino.

El parámetro CCSID puede ser cualquier expresión que se evalúa con un valor de tipo INT. La expresión se interpreta de acuerdo con las reglas normales de IBM® Integration Bus para los CCSID. Consulte Páginas de códigos soportadas para obtener una lista de valores válidos.

TipoDatos

El parámetro DataType es el tipo de datos al que se transforma el valor de origen. Los valores posibles son:
  • Tipos de serie de caracteres:
    • BIT
    • BLOB
    • CHARACTER
  • Tipos numéricos:
    • DECIMAL
    • FLOAT
    • INTEGER
  • Tipos de fecha y hora:
    • DATE
    • GMTTIME
    • GMTTIMESTAMP
    • INTERVAL
    • TIME
    • TIMESTAMP
  • Booleano:
    • BOOLEAN
Asegúrese de especificar un subtipo de intervalo ESQL válido después de un tipo de fecha hora de INTERVAL. Para los subtipos de intervalo ESQL válidos, consulte Tipo de datos ESQL INTERVAL. Por ejemplo, mandatos que muestran cómo especificar un subtipo de intervalo ESQL válido, consultelos ejemplos 12, 13 y 14 más adelante en esta sección.

Valor predeterminado

El parámetro DEFAULT proporciona un método para evitar que se generen excepciones desde sentencias CAST, proporcionando un valor de retorno de último recurso.

El parámetro DEFAULT debe ser una expresión ESQL válida que devuelve el mismo tipo de datos que el especificado en el parámetro TipoDatos, de lo contrario, se generará una excepción.

Los parámetros CCSID, ENCODING y FORMAT no se aplican al resultado del parámetro DEFAULT; por tanto, la expresión debe tener los valores adecuados de CCSID, ENCODING y FORMAT.

codificación

Utilice el parámetro ENCODING para especificar el cifrado para ciertas conversiones. El valor CODIFICACIÓN puede ser cualquier expresión que se evalúe como un valor de tipo INT, y se interprete de acuerdo con las reglas normales de IBM Integration Bus para la codificación. Los siguientes son valores válidos:
  • 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)

Formato

Utilice el parámetro FORMAT para conversiones entre tipos de datos de serie de caracteres y datos numéricos o de fecha y hora. Para conversiones de tipos de serie de caracteres, FORMAT define cómo debe analizarse la serie de caracteres de origen para satisfacer el tipo de datos de destino. Para conversiones a tipos de serie de caracteres, define cómo deben formatearse los datos de la expresión de origen en la serie de caracteres de destino.

FORMAT toma distintos tipos de expresión para conversiones de fecha y hora, y numéricas. Sin embargo, se puede utilizar la misma expresión FORMAT independientemente de si la conversión es a una serie de caracteres o de una serie de caracteres.

Puede especificar un parámetro FORMAT al realizar una conversión de tipo de datos a o de cualquiera de los tipos de datos de serie (BIT, BLOB, o CHARACTER) con los siguientes tipos numéricos, de fecha y de hora:
  • DECIMAL
  • FLOAT
  • INTEGER
  • DATE
  • GMTTIMESTAMP
  • TIMESTAMP
  • GMTTIME
  • TIME
La especificación de FORMAT para una combinación no soportada de tipos de datos de origen y de destino generará el mensaje de error BIP3205.

Para obtener más información sobre la conversión a y desde tipos de datos numéricos, consulte Formato y análisis de números como series. Para obtener más información sobre la conversión a tipos de datos de fecha y hora, consulte Formateo y análisis de fecha y hora como series.

El parámetro FORMATO es equivalente a los utilizados en muchos otros productos, como ICU y Microsoft Excel.

Ejemplos

Ejemplo 1. CAST con formato de 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'

Ejemplo 2. CAST con formato de DATE a CHARACTER

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

Ejemplo 3. CAST con formato de 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

Ejemplo 4. CAST con formato de 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)

Ejemplo 5 CAST con formato de DECIMAL a CHARACTER, con patrón 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)'

Ejemplo 6. CAST con formato de 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

Ejemplo 7. CAST desde los tipos numéricos 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);

Ejemplo 8. CAST desde los tipos numéricos 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);

Ejemplo 9. CAST a TIMESTAMP

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

Ejemplo 10. CASTs a 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);

Ejemplo 11. CASTs a INTERVAL desde 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);

Ejemplo 12. CASTs a INTERVAL desde 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);

Ejemplo 13. CASTs a INTERVAL desde 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);

Ejemplo 14. CASTs a FLOAT desde 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);

Ejemplo 15. CASTs DECIMAL desde 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);

Ejemplo 16. Una transformación ternaria que falla y origina la sustitución de un valor predeterminado

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

Ejemplo 17. Una transformación de seis elementos que falla y origina la sustitución de un valor predeterminado

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

Ejemplo 18. Una transformación ternaria que falla y genera una excepción

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

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

Ejemplo 19. Una transformación de seis elementos que falla y genera una excepción

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

  DECLARE Dummy CHARACTER CAST(2, 3, 4, 24, 6, 7.8 AS TIMESTAMP);
  END;

Ejemplo 20. Conversión de BLOB a INTEGER


    -- Input BLOB must be 16 digits
    DECLARE source BLOB X'0000000000000006';
    DECLARE target INT;
    SET target = CAST(source AS INT); 
    -- target is now base 10 integer 6

    SET source = X'00000000000012C4';
    SET target = CAST(source AS INT);
    -- target is now base 10 integer 4804
    

Ejemplo 21. Conversión de INTEGER a BLOB


   DECLARE source INT 6;
   DECLARE target BLOB;
   SET target = CAST(source AS BLOB);
   -- target is now x'0000000000000006'
   
   SET source = 4804;
   SET target = CAST(source AS BLOB);
   -- target is now x'00000000000012C4'