2009-08-25 23 views
8

estoy usando la siguiente consulta con regexp:el uso de columnas en una expresión regular en MySQL

SELECT a.id, a.company, a.name, b.title, b.description, b.t_id 
FROM a, b 
WHERE (b.title 
REGEXP "[[:<:]]a.company[[:>:]]" OR b.description 
REGEXP "[[:<:]]a.company[[:>:]]" OR b.title 
REGEXP "[[:<:]]a.name[[:>:]]" OR b.description 
REGEXP "[[:<:]]a.name[[:>:]]") AND a.company != '' AND a.name != '' 

embargo, esta consulta no está dando ningún resultado ni su dar ningún error de sintaxis.

Cuando reemplazo a.company o a.name con cualquiera de los nombres de la empresa, esta consulta funciona bien. ¿Por qué esta consulta no funciona con los nombres de las columnas?

Respuesta

10

Está buscando la cadena literal a.company, y no la columna. Prueba esto:

SELECT a.id, a.company, a.name, b.title, b.description, b.t_id 
FROM a, b 
WHERE 
    ( 
     b.title REGEXP concat('[[:<:]]', a.company, '[[:>:]]') 
     OR b.description REGEXP concat('[[:<:]]', a.company, '[[:>:]]') 
     OR b.title REGEXP concat('[[:<:]]', a.name, '[[:>:]]') 
     OR b.description REGEXP concat('[[:<:]]', a.name, '[[:>:]]') 
    ) 
    AND a.company != '' AND a.name != '' 

Esto proporciona la regexp con el valor de la columna, no la cadena 'a.company'. Como supongo que quiere comparar el valor de la columna (y no el nombre de la columna), necesitará concatenar su regexp.

Se puede comprobar esto con la siguiente consulta:

select 
    'My col: a.company' as Test1, 
    'My col: ' + a.company as Test2 
from 
    a 

Aquí, Test1 siempre será el valor My col: a.company, mientras Prueba2 será My col: <company col value here>.

+3

Está utilizando la sintaxis de concatenación de cadenas del servidor MS SQL, que MySQL no admite. Use esta sintaxis en su lugar: 'CONCAT ('[[: <:]]', a.company, '[[:>:]]')' –

+0

Gracias Eric y gracias Bill! Honestamente, estoy aprendiendo mucho con la ayuda de todos ustedes. Gracias de nuevo a stackoverflow y a todos sus miembros :-) – developer

Cuestiones relacionadas