Potente manipulación de la cadena.
By admin on Feb 7, 2009 | In Aprendiz | Send feedback »
Hola a todos, espero que Mysql en vuestros trabajos u estudios está progresando bien.
En este artículo quiero analizar la manipulación de cadenas de caracteres.
Para empezar voy a mirar la capacidad de moverse a través de una cadena un carácter cada vez.
Me parece que la mejor forma de romper una cadena aparte es el uso de un cartesiano unirse en una tabla que tiene suficiente para unirse a las filas en contra de cada carácter. Así que en mi base de datos me gusta tener una tabla (en este caso llamado pivotnumber) que acaba de un campo llamado id, pobladas con los números ascendente 1, 2, 3, etc. Por ejemplo, si yo quería mostrar un campo de texto en un manera vertical, es que podría utilizar el siguiente código
Code:
mysql> select substr(c.cat,it.pos,1) as L | |
-> from (select cat from categories where cat like 'WORK%') c, | |
-> (select id as pos from pivotnumber) it | |
-> where it.pos <= length(c.cat); | |
+---+ | |
| L | | |
+---+ | |
| W | | |
| o | | |
| r | | |
| k | | |
+---+ | |
4 rows in set |
La cláusula en la línea 4 se asegura de que la unión se lleva a cabo sólo para el mayor número de caracteres en el campo cat. Por supuesto esto es sólo una función estética, pero caminar a través de la cadena puede resultar muy útil si la realización de análisis de datos.
Otra ventaja de utilizar este JOIN de cruce (CROSSJOIN) se puede unirse a imitar dentro de un bucle en sql normal. Solo necesitas limitar por cambiar la cláusula WHERE, indicar cuántos bucles que deseas realizar.
He aquí un interesante uso de este método, que he obtenido de la fantástica SQL Cookbook por Anthony Molinaro. El siguiente código utiliza la función GROUP_CONCAT (Esta función retorna una cadena resultado con valores concatenados de un grupo)junto con el método de cadena de caminar, de poner todos los caracteres dentro de un campo en orden alfabético.
Code:
mysql> select ename, group_concat(c order by c separator '') | |
-> from ( | |
-> select ename, substr(a.ename,it.pos,1) c | |
-> from emp a, | |
-> (select id pos from pivotnumber) it | |
-> where it.pos <= length(a.ename) | |
-> ) x | |
-> group by ename; | |
+---------+-----------------------------------------+ | |
| ename | group_concat(c order by c separator '') | | |
+---------+-----------------------------------------+ | |
| ADAMS | AADMS | | |
| ALLEN | AELLN | | |
| BLAKE | ABEKL | | |
| CLARK | ACKLR | | |
| CLINTON | CILNNOT | | |
| FORD | DFOR | | |
| JAMES | AEJMS | | |
| JONES | EJNOS | | |
| KING | GIKN | | |
| MARTIN | AIMNRT | | |
| SCOTT | COSTT | | |
| SMITH | HIMST | | |
| TURNER | ENRRTU | | |
| WARD | AADDRRWW | | |
+---------+-----------------------------------------+ |
Por último, debo mencionar un par de maneras útiles de manipulación de cadenas, que no requiere los métodos anteriores. A menudo importamos campos que contienen un nombre completo, tal vez en el formato "Apellido, Nombre". Es una cuestión bastante simple para extraer la primera parte es decir, la Apellido hasta el coma. Utilizamos la función LOCATE para encontrar la posición de la primera coma y, a continuación, utilizar la función SUBSTRING de extraer la cadena hasta ese momento.
Code:
mysql> select fullname, | |
-> substring(fullname, 1, LOCATE(',', fullname)-1) as surname | |
-> from people; | |
+-------------------+-----------+ | |
| fullname | surname | | |
+-------------------+-----------+ | |
| Blanco, Martin | Blanco | | |
| Black, Clint | Black | | |
| Lopez, Julia | Lopez | | |
| Zimmerman, Robert | Zimmerman | | |
+-------------------+-----------+ | |
4 rows in set |
Para extraer el primer nombre que se encuentra en el extremo de la cadena, exige un poco más astuto. Encontra la ubicación del espacio antes de la última parte del nombre por la inversión de toda la cadena y el uso de la función LOCATE. A continuación, utiliza este valor en la función RIGHT, que extrae una subcadena de la cadena desde el lado derecho. Como este!
Code:
mysql> select fullname, | |
-> right(fullname, LOCATE(',', REVERSE(fullname)) -2) as FirstName | |
-> from people; | |
+-------------------+-----------+ | |
| fullname | FirstName | | |
+-------------------+-----------+ | |
| Blanco, Martin | Martin | | |
| Black, Clint | Clint | | |
| Lopez, Julia | Julia | | |
| Zimmerman, Robert | Robert | | |
+-------------------+-----------+ | |
4 rows in set |
Por supuesto, puede haber otras complicaciones, pero una combinación de las diversas funciones de cadenas normalmente puede resolver los problemas de datos con nombres.
Para obtener más información, por favor mira la página de documentación Mysql aquí:
mysql manual
Espero haber dado una idea de lo que se puede lograr utilizando funciones de cadenas en MySQL.
Si hay un tema en particular que quieres cubrir en este blog, por favor dejar un pedido en un comentario, y yo haría lo mas posible para obligar.
Hasta la próxima, saludos, y suerte con el código!
Feedback awaiting moderation
This post has 9 feedbacks awaiting moderation...
Leave a comment
| « Encontrar duplicados | Comprobar que un campo contiene texto » |