2012-04-24 13 views
7

To co staram się osiągnąć w swej najprostszej postaci:Wiele instrukcji jak w 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%') 

Próbuję to zrobić w UDF, która przyjmuje parametr oddzielonych przecinkami wszystkich poszukiwania warunki.

próbowałem podział tego parametru w tabeli tymczasowej i próbuje łączyć, jak to:

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) 

Ale to nie zwróci to, co chcę - zwraca wszystkie rekordy, gdzie nazwa lub SKU mecze jednej z wyszukiwane hasła. Potrzebuję go zwrócić jak pierwsze zapytanie, gdzie Nazwa lub SKU pasuje do wszystkich wyszukiwanych terminów (myślę, że to ma sens).

Byłbym bardzo wdzięczny za pchnięcie we właściwym kierunku - daj mi znać, jeśli chcesz, bym był bardziej konkretny.

Uwaga: wyszukiwanie pełnotekstowe nie jest obecnie możliwe.

Dzięki!

+0

Jeśli chcesz "dopasować wszystkie wyszukiwane hasła", nie oznacza to, że możesz mieć tylko dwa (2) wyszukiwane hasła, ponieważ masz do wyboru tylko dwie kolumny? – RBarryYoung

+0

liczba wyszukiwanych słów może być nieskończona. na przykład mogę wyszukać "biały plastikowy kubek". Tak więc dla każdego okresu nazwa produktu lub SKU musi być zgodna. Mam nadzieję, że ma to sens. – seanxe

+0

To nie ma sensu. Jak tylko dwie kolumny pasowały *** *** wszystkich trzech odrębnych kategoriach wyszukiwania? To nie jest możliwe, że masz sposób opisał go. – RBarryYoung

Odpowiedz

4

Poniższe zapytanie powinno to zrobić, ale może nie być najszybsze!

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

dzięki, dokładnie to, czego potrzebowałem. – seanxe

0

Jeśli wszystko inne zawiedzie, można uruchomić kursor nad @SearchTerms i zapętlić wyniki, sprawdzając każdy element, jeśli jest obecny w wynikach.

Najprawdopodobniej nie będziesz mieć wielu elementów do wyszukiwania (5-6 będzie tak rzadkich), więc koszt kursora powinien być pomijalny w porównaniu z ciągłym wprowadzaniem w tekście like. To też nie powinno być zbyt drogie.

Edycja: Co robiłem w przeszłości do poszukiwań jest wysłać zapytanie w postaci zwykłego tekstu do serwera zamiast opierania się na procedury przechowywane, więc mogłem poskładać moich WARUNKI siebie. Możesz zrobić to samo z zapytaniami dynamicznymi i exec na serwerze, jeśli sobie tego życzysz. Ten sposób wydaje się dość hacky i nie jest oczywiste, że jest to poprawa wydajności. Jedzenie dla myśli.

+0

dzięki za sugestię. Zawsze starałem się omijać kursory, ponieważ zawsze czytałem złe rzeczy dotyczące wydajności, ale widzę, skąd pochodzi re: liczba wyszukiwanych haseł. na pewno się teraz przyjrzę. – seanxe

+0

Witryna była pierwotnie w linq do sql i była po prostu karana pod obciążeniem, więc zdecydowaliśmy się przenieść to wszystko do sql - przyrosty wydajności były ogromne. Warto też zauważyć, że to pytanie jest małą częścią znacznie większego zapytania. dziękuję za odpowiedź, jedzenie za myślą kursorami. – seanxe

+0

To co najmniej szybkie wdrożenie rozwiązania, gdy patrzysz na coś innego (jeśli wciąż potrzebujesz takiej potrzeby), powinno być jak 6 linii kodu. – Blindy

Powiązane problemy