2010-02-10 15 views
8

Ich versuche, eine ENTHÄLT Abfrage mit mehreren Begriffen über mehrere Spalten auszuführen, wie folgt aus:ENTHÄLT mit mehreren Begriffen über mehrere Spalten

SELECT ID 
FROM Table 
WHERE CONTAINS((Data1,Data2,Data3), '"foo" & "bag" & "weee"') 

jedoch diese Abfrage verhält sich nicht wie ich es will: Ich in mindestens einer der Spalten wollen es alle Datensätze zurück, für die alle Bedingungen mindestens einmal erscheinen, wie folgt aus:

SELECT ID 
FROM Table 
WHERE CONTAINS((Data1,Data2,Data3), '"foo"') 
AND CONTAINS((Data1,Data2,Data3), '"bag"') 
AND CONTAINS((Data1,Data2,Data3), '"weee"') 

Während diese Abfrage die korrekten Ergebnisse zurückgibt, muss es eine separate UND-Klausel für jeden Begriff . Gibt es eine Möglichkeit, die gleiche Abfrage mit einer einzigen Where-Klausel wie im oberen Beispiel auszudrücken? Dies wäre praktisch, wenn die Abfrage in einer (festen) Funktion enthalten wäre.

Antwort

9

SQL Server einmal auf diese Weise verhielt, aber es wurde als bug betrachtet und "korrigiert".

Sie benötigen einen FULLTEXT Index für eine berechnete Spalte zu erstellen:

DROP TABLE t_ft 
CREATE TABLE t_ft (id INT NOT NULL, 
     data1 NVARCHAR(MAX) NOT NULL, data2 NVARCHAR(MAX) NOT NULL, data3 NVARCHAR(MAX) NOT NULL, 
     totaldata AS data1 + ' ' + data2 + ' ' + data3, 
     CONSTRAINT pk_ft_id PRIMARY KEY (id)) 

CREATE FULLTEXT INDEX ON t_ft (totaldata LANGUAGE 1033) KEY INDEX pk_ft_id 

INSERT 
INTO t_ft 
VALUES (1, 'foo bar', 'baz', 'text') 

INSERT 
INTO t_ft 
VALUES (2, 'foo bar', 'bax', 'text') 


SELECT * 
FROM t_ft 
WHERE CONTAINS (*, 'foo AND baz') 

In MySQL, im Gegenteil, die Volltext-Index sucht und Streichhölzer in allen Spalten und dies ist ein dokumentiertes Verhalten.

+1

Wow .. Unglaublich. Vielen Dank. – dbaw

Verwandte Themen