usar regexp_substr regexp reg preg_replace not examples como mysql regex select sql-like

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)+'';