2010-02-10 14 views
8

Sto cercando di eseguire una query con CONTAINS più termini su più colonne, in questo modo:CONTIENE con più termini su più colonne

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

Tuttavia, questa domanda non si comporta come voglio che: I lo voglio per tornare tutti i record per i quali tutti i termini compaiono almeno una volta in almeno una delle colonne, in questo modo:

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

Mentre questa query restituisce i risultati corretti, ha bisogno di un E-clausola di separato per ogni termine . C'è un modo per esprimere la stessa query con una sola clausola where come nell'esempio in alto? Ciò sarebbe conveniente quando si include la query in una funzione (fissa).

risposta

9

SQL Server una volta si comportava in questo modo, ma era considerato un bug e "corretto".

È necessario creare un indice FULLTEXT su una colonna calcolata:

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, al contrario, le ricerche indice full-text e le partite in tutte le colonne e questo è un comportamento documentato.

+1

Wow .. Incredibile. Grazie. – dbaw