2011-01-31 10 views
10

Potrzebuję odfiltrować rekordy w oparciu o niektóre dopasowania tekstu w kolumnie nvarchar (1000). Tabela ma ponad 400 tysięcy rekordów i rośnie. Na razie używam Stan podobny: -Jak używać warunku z wieloma wartościami w serwerze sql 2005?

SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%A1%' 
    OR Text like '%B1%' 
    OR Text like '%C1%' 
    OR Text like '%D1%' 

Czy są jakieś preferowane prace?

+4

Ty wiesz **, że użycie takiej operacji 'LIKE '% A1%'' z pewnością wyłączy każde użycie indeksu iw ten sposób spowoduje ** gwarantowany pełny przegląd tabeli ** za każdym razem ... –

Odpowiedz

0

Jeśli możesz utworzyć FULLTEXT INDEX w tej kolumnie tabeli (która zakłada wiele badań dotyczących wydajności i przestrzeni), prawdopodobnie zauważysz znaczną poprawę wydajności w zakresie dopasowywania tekstu. Możesz przejść do tego link, aby zobaczyć, co FULLTEXT SEARCH jest i tym link, aby zobaczyć, jak utworzyć FULLTEXT INDEX.

+0

Keep in pamiętaj, że indeksowanie pełnotekstowe jest oparte na słowie, podczas gdy LIKE szuka wzoru znaków w ciągu znaków. Jako konkretny przykład, wyszukiwanie pełnotekstowe "praca" nie znajdzie słowa w "przepracowany", ale klauzula LIKE będzie. –

8
SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%[A-Z]1%' 

Pozwoli to sprawdzić, czy tekst zawiera A1, B1, C1, D1, ...

Odniesienie do korzystania z Like Condition in SQL Server

+5

Mam przeczucie, że wziąłeś przykładowy kod podany nieco zbyt dosłownie. –

+0

@Joe Stefanelli ... Być może mam, ale wszystkie wymienione PO były "preferowanym obejściem" Jest to wyraźnie jeden sposób. Gdyby była to wydajność, przydatne mogłyby być wskaźniki FullText. –

4

Wystarczy popatrzeć na LIKE na msdn.

Można zmniejszyć liczbę filtrów, łącząc więcej szczegółów w pojedynczą klauzulę LIKE.

SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%[ABCD]1%' 
+5

Mam wrażenie, że wziąłeś przykładowy kod podany nieco zbyt dosłownie. –

+1

Niezupełnie. Podana kwerenda po prostu robi to samo, co oryginał. Łącze MSDN wyjaśnia, dlaczego. – msms

+1

Mogę się mylić, ale podejrzewam, że A1, B1, itd. Są po prostu sztucznymi symbolami dla szukanych łańcuchów znaków. –

5

Można spróbować wykonać następujące czynności, jeśli znasz dokładną pozycję Twojej ciąg sub:

SELECT 
    * 
FROM 
    table_01 
WHERE 
    SUBSTRING(Text,1,2) in ('B1','C1','D1') 
+0

Po pewnym badaniu, LIKE() wydaje się być skuteczniejszy niż SUBSTRING(). – mbrownnyc

0

Musiałem to zrobić tak, że mogę pozwolić dwóch różnych baz danych w filtrze dla kolumny DatabaseName w SQL Server Profiler Trace Template.

Wszystko, co możesz zrobić, to wpisać treść klauzuli Like.

Korzystając z pliku referencyjnego w John Hartscock's answer, dowiedziałem się, że klauzula like używa pewnego rodzaju ograniczonego wzoru regex.

Dla scenariusza OP, MSMS has the solution.

Zakładając chcę baz Abcone, ABCTwo i ABCThree, wymyślić, co jest w zasadzie niezależne Whitelists dla każdego znaku:

Like ABC[OTT][NWH][EOR]% 

który jest łatwo rozszerzalny do dowolnego zestawu strun. Nie będzie to ironią, że ostatni wzór będzie pasował również do ABCOwe, ABCTnr lub ABCOneHippotamus, ale jeśli filtrujesz ograniczony zestaw możliwych wartości, istnieje duża szansa, że ​​uda ci się to zrobić.

Alternatywnie można użyć operatora [^] do przedstawienia czarnej listy niedozwolonych znaków.

Powiązane problemy