2010-02-10 34 views
8

Tôi đang cố gắng để thực hiện một truy vấn CHỨA với nhiều điều kiện hơn nhiều cột, như thế này:CHỨA với nhiều điều kiện hơn nhiều cột

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

Tuy nhiên, truy vấn này không cư xử như tôi muốn nó: Tôi muốn nó trả lại toàn bộ hồ sơ mà mọi điều khoản xuất hiện ít nhất một lần trong ít nhất một trong các cột, như thế này:

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

trong khi truy vấn này trả về kết quả đúng, nó cần một VÀ-khoản riêng biệt cho mỗi hạn . Có cách nào để thể hiện cùng một truy vấn với một mệnh đề where như trong ví dụ trên không? Điều này sẽ thuận tiện khi bao gồm truy vấn trong một hàm (cố định).

Trả lời

9

SQL Server khi đã xử lý theo cách này, nhưng được coi là bug và "đã sửa".

Bạn cần phải tạo ra một chỉ số FULLTEXT trên một cột tính:

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

Trong MySQL, trái lại, các tìm kiếm index toàn văn và trận đấu trên tất cả các cột và đây là một hành vi tài liệu.

+1

Wow .. Không thể tin được. Cảm ơn. – dbaw

Các vấn đề liên quan