Potrzebuję wybierz, który zwróci wyniki takie jak to:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
Potrzebuję wszystkich wyników, tzn. Obejmuje to ciągi zawierające „słowo2 słowo3 słowo1” lub „słowo1 słowo3 słowo2” lub dowolną inną kombinację tych trzech.
Wszystkie słowa muszą znaleźć się w wyniku.
word3 word2 word1
.Zauważ, że jeśli używasz
LIKE
do ustalenia, czy ciąg jest podciągiem innego ciągu, musisz uciec od pasujących do wzorca znaków w szukanym ciągu.Jeśli Twój dialekt SQL obsługuje
CHARINDEX
, o wiele łatwiej jest go użyć:Należy również pamiętać, że to i metoda w zaakceptowanej odpowiedzi dotyczą tylko dopasowywania podciągów zamiast dopasowywania słów. Na przykład ciąg
'word1word2word3'
nadal będzie pasował.źródło
InStr()
zamiast tego użyćCHARINDEX
Funkcjonować
Pytanie
źródło
Zamiast
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
, dodaj I pomiędzy tymi słowami, takimi jak:Szczegółowe informacje można znaleźć tutaj https://msdn.microsoft.com/en-us/library/ms187787.aspx
AKTUALIZACJA
Aby wybrać frazy, użyj podwójnych cudzysłowów, takich jak:
ps musisz najpierw włączyć wyszukiwanie pełnotekstowe w tabeli, zanim użyjesz słowa kluczowego. Aby uzyskać więcej informacji, zobacz tutaj https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search
źródło
Zmieniono na
OR
naAND
podstawie edycji na pytanie.źródło
Jeśli korzystasz z bazy danych Oracle, możesz to osiągnąć za pomocą zapytania zawierającego . Zawiera zapytania są szybsze niż podobne zapytania.
Jeśli potrzebujesz wszystkich słów
Jeśli potrzebujesz któregoś ze słów
Zawiera potrzebny indeks typu CONTEXT w kolumnie.
źródło
Jeśli chcesz tylko znaleźć dopasowanie.
SQL Server:
Aby uzyskać dokładne dopasowanie. Przykład
(';a;ab;ac;',';b;')
nie pasuje.źródło
spróbuj użyć „wyszukiwania tesarus” w indeksie pełnotekstowym w MS SQL Server. Jest to znacznie lepsze niż użycie „%” w wyszukiwaniu, jeśli masz miliony rekordów. tesarus zużywają niewiele pamięci niż inne. spróbuj wyszukać te funkcje :)
źródło
Najlepszym sposobem jest utworzenie indeksu pełnotekstowego na kolumnie w tabeli i użycie zawierać zamiast LIKE
źródło
dlaczego zamiast tego nie użyć „in”?
źródło
Jednym z najprostszych sposobów na osiągnięcie tego, o czym mowa w pytaniu, jest użycie ZAWIERA z BLISKĄ lub „~”. Na przykład następujące zapytania dałoby nam wszystkie kolumny, które konkretnie zawierają słowo 1, słowo 2 i słowo 3.
Ponadto CONTAINSTABLE zwraca rangę dla każdego dokumentu na podstawie odległości między „słowem 1”, „słowem 2” i „słowem 3”. Na przykład, jeśli dokument zawiera zdanie „Słowo1 to słowo2 i słowo3”, jego pozycja w rankingu byłaby wysoka, ponieważ terminy są bliżej siebie niż w innych dokumentach.
Inną rzeczą, którą chciałbym dodać, jest to, że możemy również użyć bliskości_termu, aby znaleźć kolumny, w których słowa znajdują się w określonej odległości między nimi w obrębie frazy kolumny.
źródło
Najlepiej, jeśli jest to możliwe, przy pomocy wyszukiwania pełnotekstowego serwera SQL. Jeśli jednak z jakiegoś powodu nie możesz tego zrobić na swoim DB, oto rozwiązanie wymagające dużej wydajności: -
źródło
Spowoduje to wyświetlenie wszystkich rekordów
column1
zawierających częściową wartośćword
.źródło
źródło
lub
źródło