Usando CAST en MySQL – MariaDB

Posted by in MariaDB, MySQL

CAST es una de esas funciones que incluye MySQL que están ahí, pero que poca gente conoce. El caso es que vamos a ver un ejemplo de cómo se utiliza, a raíz de una consulta de unión. La documentación de esta función la podéis consultar aquí: http://dev.mysql.com/doc/refman/5.6/en/cast-functions.html.

Seleccionamos una tabla y hacemos una consulta, seleccionamos una segunda table y hacemos otra consulta, y creamos una consulta de UNION de ambas tablas, sabiendo que aunque son distintas, los campos deben nombrarse igual (para que la unión sea correcta!).

Consulta de UNION

Consulta de UNION

A priori, parece que todo va bien, pues incluso la consulta de UNION parece funcionar. Básicamente, seleccionamos un campo de una tabla que es de tipo VARCHAR y de la otra tabla, el campo seleccionado es de tipo INT, y a pesar de ser dos tipos diferentes, la consulta la ejecuta correctamente!

Cómo nuestra consulta funciona, y seguramente la utilicemos en más de una ocasión, decidimos hacer una vista (VIEW) con esa misma consulta:

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `test` AS
(select `stats`.`stat` AS `campo` from `stats`) union (select distinct `periodos`.`periodo` AS `campo` from `periodos`)
Creando VIEW

Creando VIEW

El resultado no es el esperado:

Error en VIEW

Error en VIEW

Corrigiendo el problema con CAST

A la vista está que algo no le ha gustado de nuestra consulta, al mezclar un tipo numérico con uno cadena en la consulta de UNION. Para recolver el problema, utilizamos CAST tal que así:

cast(periodo as char(8) charset utf8)

Modificamos la consulta:

Modificación de VIEW

Modificación de VIEW

Y comprobamos que ahora sí hemos solucionado el problema, cambiando el tipo de campo de numérico a cadena dentro de la consulta.

Vista corregida mediante CAST

Vista corregida mediante CAST

Así que, tened cuidadito con las consultas complicadas por si obteneis resultados «raros» y en caso de mezclas, ya sabéis, usaremos CAST.

Espero os haya sido de utilidad!!