T-SQL поиск по всем столбцам для текстового поля автозаполнения jquery - PullRequest
0 голосов
/ 23 июня 2019

Я пытался создать запрос для поиска определенного текста во всех столбцах, но он не работает должным образом.

Вот мой запрос:

create table #tblTempAddress (locationId int identity(1,1) primary key, postcode nvarchar(300), road nvarchar(1000), ApartmentName nvarchar(1000), district nvarchar(200), Village nvarchar(200), City nvarchar(200))

insert into #tblTempAddress values ('DY4 8QJ','Union Street',NULL,'Tipton',NULL,NULL)
insert into #tblTempAddress values ('DY4 9JP','Phillips Court','Union Street','Princes End',NULL,NULL)
insert into #tblTempAddress values ('DY4 9JR','Union Street','Princes End','Tipton',NULL,NULL)
insert into #tblTempAddress values ('DY8 1PJ','Union Street',NULL,'Stourbridge',NULL,NULL)
insert into #tblTempAddress values ('DY8 1PR','Union Street',NULL,'Stourbridge',NULL,NULL)
insert into #tblTempAddress values ('DY9 8BJ','Union Street','Lye','Stourbridge',NULL,NULL)
insert into #tblTempAddress values ('B65 0EL','Union Street',NULL,'Rowley Regis',NULL,NULL)
insert into #tblTempAddress values ('B65 0ER','Union Street',NULL,'Rowley Regis',NULL,NULL)
insert into #tblTempAddress values ('DY2 8PJ','Union Street',NULL,'Dudley',NULL,NULL)
insert into #tblTempAddress values ('DY2 8PP','Union Street',NULL,'Dudley',NULL,NULL)


declare @searchtext nvarchar(1000)
set @searchtext = 'union street'
select top 10 postcode, road, ApartmentName, District, Village, City from #tblTempAddress    
where road like '%' + @searchtext + '%'        
OR ApartmentName like '%'+ @searchtext + '%'    
OR District like '%'+ @searchtext + '%'    
OR Village like '%'+ @searchtext + '%'    
OR City like '%'+ @searchtext + '%'    
OR postcode like '%' + @searchtext + '%'   

Когда я установил@searchtext для "Union Street" возвращает все данные, относящиеся к "Union Street", но когда я добавляю "lye", например @searchtext = 'union street lye', результат не отображается, связанный с Union Street Lye, который находится в строке номер 6. Я пошелчерез этот блог, но без помощи.

1 Ответ

0 голосов
/ 23 июня 2019

Вы можете сделать что-то вроде этого.

--your table declaration here
declare @searchtext nvarchar(1000)
set @searchtext = 'union street in lye'

;with keywords as (
select value from string_split(@searchtext,' ') --tokenize @searchtext
except
select * from string_split('and or a an the for at on in why how when to from',' ')--exclude stop words
),
kwcount as (
select COUNT(value) total from keywords
),
matches as (
select t.locationId
,COUNT(distinct value) cnt
from #tblTempAddress t
inner join keywords on concat(postcode,' ', road,' ', ApartmentName,' ', district,' ', Village,' ', City) like '%'+keywords.value+'%'
group by t.locationId
)
select top 10 postcode, road, ApartmentName, District, Village, City 
from #tblTempAddress t
inner join matches m on t.locationId=m.locationId
cross join kwcount c
where m.cnt=c.total --require match all keywords in @searchtext. weaker filter may be used
order by m.cnt desc

Запрос может дать несколько ложных срабатываний, поэтому настройка фильтра желательна.
Также полнотекстовый поиск может быть очень полезным.

...