Category: Bienvenid@
Cambio de Host
By admin on Apr 7, 2009 | In Bienvenid@ | Send feedback »
Se ha cambiado el host (por razones de rendimiento). Ya esta en www.oxfordtechnotes.co.uk/sqlblog/blog1.php
Disculpe las molestias...
Comprobar que un campo contiene texto
By admin on Dec 20, 2008 | In Bienvenid@, Trucos avanzado | Send feedback »
Una tarea común en la limpieza de datos es comprobar que un campo de texto contiene datos válidos. Caracteres de control, iniciales o números pueden ser incómodas valores en algunos campos.
Si no son más que comprobar que la celda contiene texto, en contraposición a los números, me parece más fácil de hacer esto en Excel y exportar los datos si es necesario ..
Para los interesados, la fórmula para hacer esto sería algo como:
=IF(ISTEXT(A3),"Good","False") -- en ingles
=SI(ESTEXTO(A3),"exito","falso") -- en español
Sin embargo, tenemos varias opciones de abordar este problema en Mysql
Una interesante forma de hacer esto podría ser para comprobar que las letras contienen una vocal.
Sin embargo, si nos limitamos a usar el función "substring" de la siguiente manera, podríamos estar en torno a un largo tiempo. El siguiente código muestra la forma en que se iniciaría este:
Code:
SELECT firstname FROM `customer` | |
WHERE substring(firstname,1,1) not in ('A','E', 'I', 'O', 'U') | |
AND substring(firstname,2,1) not in ('A','E', 'I', 'O', 'U') | |
AND substring(firstname,3,1) not in ('A','E', 'I', 'O', 'U') |
Una forma mejor sería utilizar la función LOCATE para ver si una palabra contiene una vocal. Si la cadena no se encuentra una vocal entonces LOCATE devuelve cero.
Code:
SELECT firstname FROM `customer` | |
WHERE locate('A', firstname) = 0 | |
and locate('E',firstname) = 0 | |
and locate('I',firstname) = 0 | |
and locate('O',firstname) = 0 | |
and locate('U',firstname) = 0 |
Aunque he usado LOCATE yo podría fácilmente haber utilizado la función INSTR en su lugar.
Recuerda, sin embargo, que la sintaxis es diferente para esto:
instr(str, substr)
[ INSTR retorna la posición de la primera ocurrencia de la subcadena substr en la cadena str Es lo mismo que la forma de dos argumentos de LOCATE(), excepto que el orden de los argumentos es inverso. ]
Sin embargo, de otra manera sería usar NOT LIKE.
Code:
SELECT firstname FROM `customer` | |
WHERE firstname not like '%A%' | |
AND firstname not like '%E%' | |
AND firstname not like '%I%' | |
AND firstname not like '%O%' | |
AND firstname not like '%U%' |
Algunos de vosotros os habeis dado cuenta de hay fallas en el uso de las anteriores. ¿Qué hay de caso? Tal vez algunos sólo tienen las entradas iniciales en mayusculas? En el campo de texto no puede haber siglas o incluso la palabra inglesa "rhythm" (no contiene vocales - en castellano no hay palabras sin vocales, con una excepción, la preposición "Y").
Tal vez una mejor forma sería la de asegurarse de que el valor de la letra tiene un buen valor ASCII. Por ejemplo:
Code:
select firstname, ascii(substring(firstname,1,1)), gender | |
from customer | |
where ascii(substring(firstname,1,1)) not between 65 and 122 | |
and ascii(substring(firstname,1,1)) > 0 |
Si los números son válidos aquí, podemos probar para valores entre 48 y 122. Aquí hay enlacea a la tabla de valores ascii.
ascii tables faq
Por supuesto, el código anterior sólo funciona en pruebas el primer carácter de la cadena. Con el fin de probar todas las características de la cadena tenemos que iterar a través de una cadena de caracteres. Voy a mostrar cómo hacer esto en mi próxima entrada del blog.
Por último, para los programadores avanzados, hay una gran capacidad en MySQL - la capacidad de utilizar las expresiones regulares. Una vez más, esto necesita una mayor explicación de lo que yo tengo tiempo para de esta entrada. Sin embargo, hay una sección dedicada a esto en el manual de Mysql páginas. Aqui es el enlace:
mysql manual regexp
Se puede aprender mas sobre expressiones regulares aqui:
mas sobre expressiones regulares
Si decides utilizar expresiones regulares, recuerda que a pesar de que puede ser muy poderoso, también pueden golpear problemas de rendimiento en tablas grandes.
Bueno, en conclusión, hay muchas maneras de enfocar este tipo de tarea en MySQL. Espero que toma nota de lo anterior han dado una buena idea de cómo podemos hacer esto.
Trucos de Command Line
By admin on May 31, 2008 | In Bienvenid@ | Send feedback »
Una de las cosas de la frustración encontré cuando comenzaba a utilizar Mysql, era la dificultad en comunicar con la línea de comando (utilizo linux) cuando dentro del am-biente de Mysql. Aquí están algunos comandos útiles he encontrado
(Corregiré esto si encuentro más)
Code:
\! cat case1.sql |
-- entra en modo de Linux shell y (en este caso con comando 'cat') muestra el código para case1.sql
Esto permite ahorrar tus declaraciones de sql de la línea de comando de Mysql en un fichero en tu Host local
Code:
\! echo 'select * from emp where job ="salesman" ' > test2.sql |
Por supuesto, cuando necesitas funcionar una declaración de sql has ahorrado previamente:
Code:
\. case1.sql OR source case1.sql |
-- Esto ejecuta el archivo case1.sql dentro del mysql
Por supuesto puedes desear funcionar una declaración de sql de la línea de comando de Linux.
Si escribes..
Code:
mysql -u root -p < case1.sql |
entonces hay un Prompt para la contraseña. Tamb-ién, tienes que averiguar de que la declaración de case1.sql contenga la declaración "use dbname";
puedes hacer esto en lugar de otro:
Code:
mysql -u root -ptiger one < case1.sql |
Aquí la contraseña se puede entrar en la línea de comando siempre y cuando no dejas un espacio después del Switch de p (no deja esto en archivos de comando sin embargo!) y puedes especificar el nombre de base de datos (en este caso one) que estás utilizando.
Si sabeis de cualquie otras trucos útiles en este tema sienteis por favor libres de dejar la reaccion. Os agredezco mucho.
Espero tam-bién que la gente esté encontrando estas notas del uso.
Noticia Junio 1 - Acabo de encontrar otra manera de almacenar los resultados de consultas en un fichero de sistema operativo. Primero se entra \T y el nombre del fichero. Luego, para desactivar entra \t