2009-08-25 7 views
8

Ich verwende die folgende Abfrage mit regexp:Verwendung von Spalten in einer RegExp in 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 != '' 

Aber diese Abfrage kein Ergebnis wird geben noch ihr jeden Syntaxfehler gibt.

Wenn ich a.company oder a.name durch irgendeinen des Firmennamens ersetze, läuft diese Frage gut. Warum funktioniert diese Abfrage nicht mit den Spaltennamen?

Antwort

10

Sie suchen nach der Literalzeichenfolge a.company und nicht nach der Spalte. Versuchen Sie folgendes:

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 != '' 

Das die regexp mit dem Wert der Spalte enthält, nicht die Zeichenfolge 'a.company'. Da ich denke, dass Sie den Spaltenwert (und nicht den Spaltennamen) vergleichen möchten, müssen Sie Ihre regexp miteinander verketten.

Sie können dies testen mit dieser Abfrage:

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

Hier Test1 wird immer der Wert My col: a.company, während Test2 My col: <company col value here> sein wird.

+3

Sie verwenden die MS SQL Server String-Verkettungssyntax, die MySQL nicht unterstützt. Verwenden Sie stattdessen diese Syntax: 'CONCAT ('[[: <:]]', a.company, '[[:>:]]')' –

+0

Danke Eric und danke Bill! Nun, ehrlich, ich lerne viel mit Hilfe von euch allen. Danke nochmal an stackoverflow und all seine Mitglieder :-) – developer