Función CAST

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

SINTAXIS

Nota: En la práctica, no puede especificar todos los parámetros anteriores al mismo tiempo. Por ejemplo, las expresiones 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).

CAST transforma uno o más valores de un tipo de datos a otro. Por ejemplo, puede utilizar CAST para procesar los mensajes XML genéricos. Todos los campos de un mensaje XML tienen valores de caracteres, por lo tanto si, por ejemplo, desea realizar un cálculo aritmético o una comparación de hora y fecha en un campo, puede utilizar CAST para convertir el valor de la serie de caracteres del campo en un valor del tipo adecuado.

No se da soporte a todas las conversiones; consulte Transformaciones CAST soportadas para obtener la lista de las 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

La cláusula CCSID sólo se utiliza para conversiones a o de uno de los tipos de datos de serie de caracteres. Le permite especificar la página de códigos de la serie de caracteres de origen o de destino.

La expresión CCSID puede ser cualquier expresión que se evalúa con un valor de tipo INT. Se interpreta según las normas de WebSphere Message Broker normales para los CCSID. Consulte Páginas de códigos soportadas para obtener una lista de los valores válidos.

TipoDatos

TipoDatos es el tipo de datos al que debe transformarse el valor 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

DEFAULT

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

DEFAULT expresión 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 de CCSID, ENCODING y FORMAT no se aplican al resultado de la expresión DEFAULT; por tanto, la expresión debe ser del CCSID, ENCODING y FORMAT correcto.

ENCODING

La cláusula ENCODING le permite especificar la codificación. Se utiliza sólo para determinadas conversiones. El valor de ENCODING puede ser cualquier expresión que se evalúe con un valor de tipo INT. Se interpreta según las normas de WebSphere Message Broker para codificación normales. Los valores válidos son:
  • 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

Para conversiones entre tipos de datos de serie de caracteres y tipos de datos numéricos o de fecha y hora, puede proporcionar una expresión FORMAT opcional. 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 una expresión FORMAT al realizar transformaciones:
  • De cualquier tipo de datos de serie de caracteres (BIT, BLOB o CHARACTER) a:
    • DECIMAL
    • FLOAT
    • INTEGER
    • DATE
    • GMTTIMESTAMP
    • TIMESTAMP
    • GMTTIME
    • TIME
  • A cualquier tipo de datos de serie de caracteres (BIT, BLOB o CHARACTER) desde cualquier tipo de datos numérico o de fecha y hora, listados en el punto anterior.
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 de caracteres. Para obtener más información sobre la conversión a y desde tipos de datos de fecha y hora, consulte Formato y análisis de valores de fecha y hora como series de caracteres.

La expresión FORMAT es equivalente a las que se utilizan en muchos otros productos como, por ejemplo, ICU y Microsoft Excel.

Ejemplos

Ejemplo 1. CAST formateado 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);
-- ahora el destino es "31,415.93"

Ejemplo 2. CAST formateado de DATE a CHARACTER

DECLARE now CHARACTER = CAST(CURRENT_TIMESTAMP AS CHARACTER 
                        FORMAT "yyyyMMdd-HHmmss");
-- ahora el destino es "20041007-111656" (al menos, en esta instancia)

Ejemplo 3. CAST formateado 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);
-- ahora el destino contiene Year=2003, Month=02, Day=01

Ejemplo 4. CAST formateado 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);
-- ahora el destino contiene Year=2003, Month=01, Day=03, Hour=15, Minute=45, Seconds=58 
-- (segundos tomados de CURRENT_TIME puesto que no están presentes en la entrada)

Ejemplo 5. CAST formateado 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);
-- ahora el destino es "£(54,231.12)"

Ejemplo 6. CAST formateado 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);
-- ahora el destino contiene Hour=16, Minute=18, Seconds=30

Ejemplo 7. CASTs de 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. CASTs de 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. CASTs de tipos numéricos a GMTTIME

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 TIMESTAMP

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

Ejemplo 11. 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 12. 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 13. 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 14. 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 15. 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 16. 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 17. Una transformación ternaria que falla y origina la sustitución de un valor por omisión

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

Ejemplo 18. Una transformación de seis elementos que falla y origina la sustitución de un valor por omisión

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

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

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;

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

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;
Conceptos relacionados
Visión general de ESQL
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ak05610_