2010-02-10 47 views
8

我試圖執行一個包含了多列多條件查詢,例如:包含了多個列的多個方面

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

但是,此查詢不表現得像我把它想:我希望它返回其中所有術語在列中的至少一個至少出現一次的所有記錄,像這樣:

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

雖然這個查詢返回正確的結果,它需要一個單獨的AND-子句每學期。有沒有一種方法可以像上例那樣使用單個where子句來表示相同的查詢?將查詢包含在(固定)函數中時,這會很方便。

回答

9

SQL Server曾經這樣表態,但它被認爲是bug和「糾正」。

你需要在計算列上創建索引FULLTEXT

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') 

MySQL,相反,在所有列的全文索引搜索和匹配,這是一個記錄的行爲。

+1

哇..令人難以置信的。謝謝。 – dbaw 2010-02-10 15:21:01