2009-08-25 16 views
8

używam następującą kwerendę z regexp:stosując kolumny w RegExp w 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 != '' 

Ale ta kwerenda nie daje żadnych rezultatów ani podania błąd składni.

Po zastąpieniu a.company lub a.name z dowolną nazwą firmy, to zapytanie działa poprawnie. Dlaczego to zapytanie nie działa z nazwami kolumn?

Odpowiedz

10

Szukasz literalnego ciągu znaków a.company, a nie kolumny. Spróbuj tego:

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

Zapewnia to regexp z wartością kolumny, a nie ciąg 'a.company'. Ponieważ domyślam się, że chcesz porównać wartość kolumny (a nie nazwę kolumny), musisz połączyć ze sobą swoją regexp.

można przetestować to z tego zapytania:

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

Tutaj Test1 zawsze będzie wartością My col: a.company, natomiast Test2 będzie My col: <company col value here>.

+3

Używasz składni łańcuchowej MS SQL Server, której MySQL nie obsługuje. Użyj następującej składni: 'CONCAT ('[[: <:]]', a.company, '[[:>:]]')' –

+0

Dzięki Eric i dzięki Bill! szczerze, dużo się uczę z pomocą was wszystkich. Jeszcze raz dziękuję Stackoverflow i wszystkim jego członkom :-) – developer