Sql запрос поиск значений которые могут быть в любом порядке
Мои друзья,
на SQL Server 2014 у меня есть хранимая процедура поиска. В текущем случае он проверяет наличие %searchterm% по нескольким полям. Если он совпадает, то возвращает данные.
В большинстве случаев это нормально, но что такое тот, кто ищет "б а" вместо "А Б"? Пользователь не увидит никакого результата, пока они есть. Как я могу выполнить поиск с неизвестным порядком клавиш поиска?
Я создал функцию SplitString (в sql server 2016 она есть, но в 2014 году не работает), чтобы иметь строки, которые содержат один поисковый запрос на строку.
Как я могу использовать эти строки в like, чтобы я мог возвращать результаты, основанные на случайном порядке заданных поисковых запросов пользователем
Что я уже пробовал:
DECLARE @searchtext NVARCHAR(1000)= 'vessel ship container'; SELECT pv.[Id], [ProjectNo], [MainProjectNo], [ProjectDescription], [CustomerNo], [CustomerName], [Status], CASE WHEN [ProjectTypeCode] = 'NULL' THEN NULL ELSE [ProjectTypeCode] END AS [ProjectTypeCode], [ManagerName], CASE WHEN [EngineerName] = 'NULL' THEN NULL ELSE [EngineerName] END AS [EngineerName], FROM [dbo].[IProjectView] AS pv CROSS APPLY dbo.SplitString(@searchtext, ' ') as res WHERE 1 = 1 AND ProjectNo LIKE '%' + @searchtext + '%' OR MainProjectNo LIKE '%' + @searchtext + '%' OR CustomerNo LIKE '%' + @searchtext + '%' OR CustomerName LIKE '%' + @searchtext + '%' OR [Status] LIKE '%' + @searchtext + '%' OR ProjectTypeCode LIKE '%' + @searchtext + '%' OR ManagerName in (select [Value] from dbo.SplitString(@searchtext, ' ')) -- LIKE '%' + @searchtext + '%' OR EngineerName LIKE '%' + @searchtext + '%' OR ProjectDescription LIKE '%' + @searchtext + '%' ORDER BY ProjectNo;
Функция SplitString возвращает:
%vessel% %ship% %container%
W∴ Balboos, GHB
Результаты splitstring, в серии как .... И ВРОДЕ ТОГО ... похоже, они сделают свое дело. И сила всех спичек, но в любом месте строки будет делать это для каждого.
Вам нужно построить запрос динамически, основываясь на количестве элементов в ваших результатах разделения строк (или должно быть, это " делает лучшее упражнение)
Herman<T>.Instance
динамически, вы имеете в виду CTE?
W∴ Balboos, GHB
Нет - я очень просто об этом говорю. Вы можете построить строку запроса в цикле, чтобы она обрабатывала каждый из N компонентов.
Другой способ: создайте таблицу #temp с результатами совпадения подстроки on. Затем удаляются из этой таблицы все, что не содержит других подстрок.
Это действительно тот же самый чистый результат, что и куча подобных предложений and'Ed.
Ничего таинственного - прямолинейно и прямолинейно. Если бы я делал это, я бы строил свою строку на php (или C или C++) и отправлял ее на уже построенный сервер.