regexp_substr - MySQL SELECT LIKE o REGEXP para unir mĂșltiples palabras en un registro
regexp sql (6)
Bueno, si conoces el orden de tus palabras ... puedes usar:
SELECT `name` FROM `table` WHERE `name` REGEXP ''Stylus.+2100''
También puedes usar:
SELECT `name` FROM `table` WHERE `name` LIKE ''%Stylus%'' AND `name` LIKE ''%2100%''
La table
campo. name
contiene ''Stylus Photo 2100'' y con la siguiente consulta
SELECT `name` FROM `table` WHERE `name` LIKE ''%Stylus 2100%''
No obtengo resultados Por supuesto que lo haría si busqué
SELECT `name` FROM `table` WHERE `name` LIKE ''%Photo 2100%''
¿Cómo puedo seleccionar el registro buscando "Stylus 2100"?
Gracias
Creo que la mejor solución sería usar expresiones regulares. Es más limpio y probablemente el más efectivo. Las expresiones regulares son compatibles con todos los motores de DB comúnmente utilizados.
En MySql hay RLIKE
operador RLIKE
por lo que su consulta sería algo así como: SELECT * FROM buckets WHERE bucketname RLIKE ''Stylus|2100''
No soy muy fuerte en expresiones regulares, así que espero que la expresión esté bien.
Editar
El RegExp debería ser:
SELECT * FROM buckets WHERE bucketname RLIKE ''(?=.*Stylus)(?=.*2100)''
Más sobre el soporte de MySql regexp:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp
La solución correcta es una búsqueda de texto completo (si puede usarla) https://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
Esto casi hace lo que quieres:
SELECT * FROM buckets WHERE bucketname RLIKE ''(Stylus|2100)+.*(Stylus|2100)+'';
SELECT * FROM buckets WHERE bucketname RLIKE ''(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*'';
Pero esto también coincidirá con "210021002100", que no es genial.
Puedes simplemente reemplazar cada espacio con %
SELECT `name` FROM `table` WHERE `name` LIKE ''%Stylus%2100%''
echa un vistazo a http://www.techonthenet.com/sql/like.php
con LIKE ''% Stylus 2100%'', pide una cadena que contenga exactamente ''Stylus 2100'', y ''Stylus Photo 2100'' no contiene esa cadena, hay ''Foto'' adentro;
necesitas hacer algo como esto,
SELECT * FROM buckets WHERE bucketname RLIKE ''Stylus.*2100'';
o
SELECT * FROM buckets WHERE bucketname RLIKE ''(Stylus)+.*(2100)+'';