ASP.NET для одного текстового поля Поиск по нескольким ключевым словам

2

Прямо сейчас, у меня есть:

Upper(tb.name) LIKE Upper('%' + :SearchBox + '%')

При этом я могу ввести одно ключевое слово и, если он существует в tb.name, он вернется в результаты. Я хотел бы иметь возможность вводить несколько ключевых слов в SearchBox, разделенных пробелами, и возвращать результаты, содержащие ВСЕ ключевые слова.

Пример: я набираю "Форд" в SearchBox и возвращаюсь

Name
2015 Ford SUV Blue
2016 Ford SUV Black
2017 Ford SUV Blue

Я хотел бы иметь возможность набирать "Ford Blue" (или любое другое количество ключевых слов) для возврата

Name
2015 Ford SUV Blue
2017 Ford SUV Blue

Любой ввод ключевых слов будет разделен пробелом. Итак, если я наберу "SUV Blue 2017", это будет "SUV" и "Blue" AND "2017". Любая помощь очень ценится!

  • 0
    Возможный дубликат объединения «LIKE» и «IN» для SQL Server
  • 0
    Не уверен в том, как достичь общей цели: взять слова, введенные несколькими пользователями, из одного текстового поля и встроить их в предложение WHERE. Мое утверждение намного больше, чем это, я просто использовал пример.
Показать ещё 1 комментарий
Теги:

2 ответа

0

Поместите% в свою пустую строку, например:

WITH TB AS(
     SELECT 'Ford SUV Blue' NAMES FROM DUAL UNION ALL
     SELECT 'Ford SUV GREEN' NAMES FROM DUAL UNION ALL
     SELECT 'SOME thing there' FROM DUAL 
)
SELECT * FROM TB H
WHERE Upper(H.NAMES) LIKE Upper('%SOME% %thing%');
0

Вам нужно разделить строку ключевого слова и найти строки, в которых все они существуют. Что-то вроде этого (см. Комментарии в коде).

declare @keywords varchar(max)='ford blue'

--build a series of CTE
;with split as ( --split keyword string into table
select '%'+value+'%' v from string_split(@keywords,' ')
),
cnt as ( -- always single value
select count(*) cnt from split
),
prod as(
select p.* ,
COUNT(t.v) over(partition by p.name) cnt,
ROW_NUMBER() over(partition by p.name order by p.name) rn
from tb p
--where ProductName like all -- illegal and never work
inner join split t on p.ProductName like t.v
)
select * from prod
cross join cnt -- don't afraid of Cartesian product here
where prod.cnt = cnt.cnt -- all keywords found
and rn=1 -- no duplicates

Ещё вопросы

Сообщество Overcoder
Наверх
Меню