відповідь sp_BlitzErik вражає безліччю хороших моментів, але я не думаю, що тому ви не повинні використовувати повний пошук тексту. Повний текст пошуку не існує, щоб робити те, що ви думаєте, що це робить. Це не для пошуку кількох полів. Це там, щоб векторизувати вміст слів та використовувати словники, заглушки, лексеми, газети, усунення стоп-слів та низку інших хитрощів, жоден з яких не застосовується. Або ще не показано, що вони звертаються.
Я також не згоден з рішенням, хоча я не впевнений, як це зробити краще на SQL Server. Давайте відтворимо його дані для PostgreSQL - це набагато чистіше створити в PostgreSQL.
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;
Тепер те, що ви хочете, - це перелік,
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
Тепер ви згорнули рядки до цілих уявлень. Але ще краще ви можете запитувати їх, як раніше.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
Це має ефект.
- приховує той факт, що ви категорії перераховані. Ця складність інкапсульована у тип та прихована від користувача.
- він також розміщує технічне обслуговування цих категорій на типі.
- це стандартизовано.
- вона не збільшує розмір рядка
Без цих переваг ви по суті просто намагаєтесь оптимізувати порівняння рядків. Але на жаль, я навіть не впевнений, як sp_BlitzErik потрапляє на відповідь, надану кодом у пропозиції,
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Ви можете згорнути жетони до цілих чисел, використовуючи enum, або метод ручного прокатування, запропонований sp_BlitzErik, але якщо ви можете зробити згортання, чому ви робите і без закоху? Тобто, якщо ви знаєте, що "% pasta%" - це маркер "pasta", чому у вас є %
обидві сторони. Без '%' це перевірка рівності, і це має досить швидко, навіть як текст.