Поиск частичного текста в столбце - PullRequest
0 голосов
/ 03 октября 2019

У меня есть поле поиска в системе администратора, где пользователь может ввести критерии поиска, чтобы найти продукт для редактирования в своем магазине. Некоторые из названий продуктов длинные и похожие. Например, у меня есть несколько названий продуктов с измерениями в них. Вот пример:

Widget Brown Bull Edge Stone 400x500x600 
Widget Brown Bull Snow Stone 700x500x300 

Существует около сотни подобных продуктов, похожих по названию, с небольшими вариациями в цвете, размере или описании.

Я пробовал использовать regExбез особой удачи, я также, к сожалению, попробовал варианты LIKE, но безуспешно.

Я хочу иметь возможность вводить критерии поиска в поле формы HTML и использовать SQL, чтобы ограничить результаты в зависимости от объема поиска. критерии, которые я ввожу.

Например, если я ввел:

"Widget Brown 400" в поле поиска, я не могу использовать% like% в предложении where, так как он не будет соответствовать этомушаблон.

Мой идеальный результат - ввести Widget Brown 400, и в списке результатов будут показаны продукты, соответствующие критериям поиска.

1 Ответ

0 голосов
/ 03 октября 2019

Как пояснил Гордон Линофф, лучшим подходом было бы согласиться на полнотекстовый поиск SQL-Server.

Кроме этого, другим, менее элегантным и производительным решением было бы использовать табличное значениефункция STRING_SPLIT() (доступна в SQL Server 2016), чтобы превратить искомые слова в производную таблицу, а затем искать каждое отдельное слово в тексте, используя LIKE. Если в тексте присутствуют все искомые слова, значит, у вас есть совпадение.

Обратите внимание:

SELECT * 
FROM mytable t
WHERE NOT EXISTS (
     SELECT 1
     FROM STRING_SPLIT(@search, ' ') x
     WHERE t.txt NOT LIKE '%' + x.value + '%'
);

Демонстрация на DB Fiddle

CREATE TABLE mytable (id int, txt varchar(max));

INSERT INTO mytable VALUES
    (1, 'Widget Brown Bull Edge Stone 400x500x600'),
    (2, 'Widget Brown Bull Snow Stone 700x500x300');

DECLARE @search NVARCHAR(400) = 'Widget Brown 400'; 

SELECT * 
FROM mytable t
WHERE NOT EXISTS (
     SELECT 1
     FROM STRING_SPLIT(@search, ' ') x
     WHERE t.txt NOT LIKE '%' + x.value + '%'
);
id | txt                                     
-: | :---------------------------------------
 1 | Widget Brown Bull Edge Stone 400x500x600
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...