2012-04-24 31 views
7

Đây là những gì tôi đang cố gắng để đạt được trong đó là hình thức đơn giản nhất:Nhiều báo cáo NHƯ trong TSQL

SELECT 
    p.ProductId, 
    p.ProductName, 
    p.SKU 
FROM tbl_Product p 
WHERE (p.ProductName LIKE '%white%' OR p.SKU LIKE '%white%') 
AND (p.ProductName LIKE '%cup%' OR p.SKU LIKE '%cup%') 

Tôi đang cố gắng để làm điều này trong một UDF, mà chấp nhận một dấu phẩy thông số tách ra của tất cả các tìm kiếm điều kiện.

tôi đã cố gắng tách rằng tham số vào một bảng tạm thời và cố gắng tham gia, như thế này:

DECLARE @SearchText nvarchar(1000) SELECT @SearchText='white,cup' 

DECLARE @SearchTerms TABLE (String nvarchar(200)) 
INSERT INTO @SearchTerms (String) 
SELECT '%' + String + '%' FROM dbo.CsvSplitString(@SearchText) 

SELECT 
    p.ProductId, 
    p.ProductName, 
    p.SKU 
FROM tbl_Product p 
JOIN @SearchTerms s ON (p.ProductName LIKE s.String OR p.SKU LIKE s.String) 

Nhưng điều đó không trả lại những gì tôi muốn - nó trả về bất cứ hồ sơ có Tên hoặc SKU phù hợp với một trong hai các cụm từ tìm kiếm. Tôi cần nó trở lại giống như truy vấn đầu tiên, trong đó Tên hoặc SKU khớp với tất cả các cụm từ tìm kiếm (tôi nghĩ điều đó có ý nghĩa).

Sẽ được đánh giá ồ ạt về việc đẩy đúng hướng - hãy cho tôi biết nếu bạn cần tôi cụ thể hơn.

Lưu ý: tìm kiếm toàn văn không phải là một lựa chọn khả thi tại thời điểm này.

Cảm ơn!

+0

Nếu bạn cần "khớp tất cả cụm từ tìm kiếm", điều đó có nghĩa là bạn chỉ có thể có hai (2) cụm từ tìm kiếm, vì bạn chỉ có hai cột để so khớp? – RBarryYoung

+0

số lượng cụm từ tìm kiếm có thể là vô hạn. ví dụ tôi có thể tìm kiếm "cốc nhựa màu trắng". Vì vậy, đối với mỗi thuật ngữ, ProductName hoặc SKU phải khớp nhau. Hy vọng rằng có ý nghĩa. – seanxe

+0

Nó không có ý nghĩa. Làm cách nào để chỉ có hai cột khớp với *** tất cả *** trong ba cụm từ tìm kiếm riêng biệt? Nó không thể theo cách mà bạn đã mô tả nó. – RBarryYoung

Trả lời

4

Truy vấn dưới đây nên thực hiện nhưng có thể không phải là nhanh nhất!

DECLARE @SearchText nvarchar(1000) SELECT @SearchText='white,cup' 
DECLARE @keywords TABLE (keyword nvarchar(255)) 
DECLARE @keywordCount int 

INSERT INTO @keywords (keyword) SELECT * FROM dbo.CsvSplitString(@SearchText) 
SET @keywordCount = (SELECT COUNT(*) FROM @keywords) 


SELECT * 
FROM tbl_Product p 
WHERE EXISTS 
    (SELECT * 
    FROM 
     (SELECT productId 
     FROM tbl_Product, @keywords 
     WHERE productname like '%' + keyword + '%' or sku like '%' + keyword + '%' 
     GROUP BY productid 
     HAVING COUNT(*) = @keywordCount 
     ) matches 
    WHERE p.ProductId=matches.ProductId 
    ) 
+0

cảm ơn, chính xác những gì tôi cần. – seanxe

0

Nếu vẫn thất bại, bạn có thể chạy con trỏ qua @SearchTerms và lặp lại kết quả, kiểm tra từng mục nếu nó có trong kết quả của bạn.

Bạn rất có thể sẽ không có nhiều mục tìm kiếm (5-6 sẽ rất hiếm), vì vậy chi phí con trỏ sẽ không đáng kể so với chạy like lặp đi lặp lại trên văn bản của bạn. Và điều đó cũng không quá đắt.

Chỉnh sửa: Những gì tôi đã thực hiện trong quá khứ cho tìm kiếm là gửi truy vấn bằng văn bản thuần tuý tới máy chủ thay vì dựa vào các thủ tục được lưu trữ, vì vậy tôi có thể tự mình điều chỉnh các điều kiện của mình. Bạn có thể làm tương tự với các truy vấn động và exec trên máy chủ nếu bạn muốn. Bằng cách này có vẻ khá hacky và nó không rõ ràng đó là một cải tiến hiệu suất. Thức ăn cho sự suy nghĩ.

+0

cảm ơn đề xuất. Tôi đã luôn luôn cố gắng để chỉ đạo rõ ràng từ con trỏ vì tôi luôn luôn có vẻ đọc những điều xấu về hiệu suất, nhưng tôi có thể nhìn thấy nơi bạn đang đến từ lại: số lượng các thuật ngữ tìm kiếm. Tôi chắc chắn sẽ có một cái nhìn vào nó ngay bây giờ. – seanxe

+0

trang web ban đầu ở dạng linq để sql, và chỉ bị trừng phạt dưới tải vì vậy chúng tôi quyết định di chuyển tất cả vào sql - lợi nhuận peformance đã rất lớn. nó có thể là giá trị chỉ ra cũng là câu hỏi này là một phần nhỏ của một truy vấn lớn hơn nhiều. cảm ơn cho câu trả lời của bạn mặc dù, thực phẩm cho suy nghĩ với con trỏ. – seanxe

+0

Đó là ít nhất là một giải pháp nhanh chóng để thực hiện trong khi bạn nhìn vào cái gì khác (nếu bạn vẫn cảm thấy sự cần thiết cho nó), nên được như 6 dòng mã. – Blindy

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