Odpowiedź sp_BlitzErik zawiera wiele dobrych punktów, ale nie sądzę, że dlatego nie powinieneś używać wyszukiwania pełnotekstowego . Wyszukiwanie pełnotekstowe nie służy do robienia tego, co myślisz. Nie ma tam wyszukiwania wielu pól. Ma na celu wektoryzację treści słów i korzystanie ze słowników, stubowania, leksykonów, gazet, eliminacji słów zatrzymanych i mnóstwa innych sztuczek, z których żadna nie ma zastosowania. Lub, jeszcze nie wykazano ich zastosowania.
Nie zgadzam się również z tym rozwiązaniem, chociaż nie jestem pewien, jak to zrobić lepiej w SQL Server. Utwórzmy ponownie jego dane dla PostgreSQL - tworzenie PostgreSQL jest o wiele czystsze.
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
Teraz chcesz tego typu enum,
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
Teraz zwinąłeś ciągi do reprezentacji liczb całkowitych. Ale jeszcze lepiej możesz zapytać o nie tak jak wcześniej.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
To ma efekt.
- ukrywa fakt, że kategorie są typem wyliczonym. Ta złożoność jest zawarta w typie i ukryta przed użytkownikiem.
- umieszcza także konserwację tych kategorii na typie.
- jest ustandaryzowany.
- nie zwiększa rozmiaru wiersza.
Bez tych korzyści zasadniczo próbujesz zoptymalizować porównanie ciągów znaków. Ale niestety nie jestem nawet pewien, jak sp_BlitzErik dostaje odpowiedź na podany kod w sugestii,
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Możesz zwinąć tokeny do liczb całkowitych za pomocą wyliczenia lub metody zwijania rąk sugerowanej przez sp_BlitzErik, ale jeśli możesz zrobić zwijanie, dlaczego robisz też niezakotwiczone? To znaczy, jeśli wiesz, że „% makaron%” jest tokenem „makaron”, dlaczego masz %
po obu stronach. Bez „%” jest to kontrola równości i powinna być dość szybka, nawet jako tekst.