2011-10-07 45 views
8

Tôi đang chạy hai truy vấn trên một bảng.SQL: Giống như so sánh - Các kết quả khác nhau

SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS, 'STYCAST') 

SELECT MSDS FROM dbo.MSDSSearch3 WHERE MSDS like '%STYCAST%' 

Truy vấn đầu tiên sẽ trở lại

'STYCAST 50300 LV' 

Và thứ hai sẽ trở lại

'STYCAST 50300 LV' 
'STYCAST 2851 BLACK' 

Có ai biết lý do tại sao những thứ tương tự sẽ trở lại nhiều giá trị hơn chứa? Có vấn đề gì với cách tôi đang chạy không? Cảm ơn trước.

+0

gì phiên bản của SQL Server? Nếu năm 2008 bạn có thể nhận được một số khả năng hiển thị vào trình phân tích cú pháp với 'SELECT * FROM sys.dm_fts_parser ('" STYCAST 2851 BLACK "', 1033, 0,0)' Tôi không thể thấy bất kỳ lý do nào tại sao các chuỗi sẽ được xử lý khác nhau. –

+3

Câu hỏi thú vị, bạn có chắc chắn rằng cả hai giá trị đều giống nhau không? như không có ký tự khoảng trống đầu/cuối. Điều đó có thể gây ra vấn đề này vì CONTAINS sẽ khớp chính xác với văn bản của bạn trong khi LIKE sẽ khớp với văn bản của bạn + bất kỳ thứ gì ở hai bên của nó – Purplegoldfish

+11

Âm thanh như trường hợp danh mục fulltext của bạn đã lỗi thời. Bạn có thể thử xây dựng lại nó bằng [ALTER FULLTEXT CATALOG] (http://msdn.microsoft.com/en-us/library/ms176095.aspx). –

Trả lời

2

CONTAINS là một hàm hoàn toàn khác, đó là truy vấn dựa trên vị ngữ cho các cột toàn văn bản; nó không phải là một hàm để xác định xem một cột có chứa một chuỗi trong đó hay không.

Đối với truy vấn bạn đang chạy, bạn có thể sử dụng này:

SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS, '"STYCAST*"') 

Ở đó bạn có một tìm kiếm tiền tố, thay vì tìm kiếm simple_term như bạn đang có.

Thông tin chi tiết: http://msdn.microsoft.com/en-us/library/ms187787.aspx


Có lẽ trong cách bạn đang sử dụng nó trở thành văn bản 'STYCAST 2851 BLACK' không rơi vào kết quả bởi vì nó có tính cách một hơn 'STYCAST 50300 LV', vì vậy đó là trận đấu [7 trên 17] với [7 trên 16 trận đấu]. Tôi không chắc nhưng điều đó có thể giải thích hành vi kỳ lạ này.

+0

Chỉ cần thử nghiệm giải pháp này, với cùng một kết quả. CHỌN MSDS TỪ dbo.MSDSSearch3 CÓ BAO GIỜ (MSDS, '"STYCAST *"') Vẫn trả về một giá trị. – Corey

+0

Buồn khi đọc điều đó; Sau đó, nó phải là một cửa hàng đã lỗi thời, nhưng bạn nói rằng bạn đã cập nhật nó. Nó là rất lạ. – daniloquio

+0

Điều gì sẽ xảy ra nếu bạn thực hiện điều này: CHỌN MSDS TỪ dbo.MSDSSearch3 Ở ĐÂU (MSDS, 'STYCAST 2851 BLACK')? – daniloquio

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