Создание динамического поиска с использованием хранимых процедур T-SQL - PullRequest
1 голос
/ 15 ноября 2011

Есть ли способ создать поиск по количеству слов?

Например, если я ищу car и wheel, это создаст поиск T-SQL, например

select * from table 
where
    (word is like @word1)
    and (word is like @word2)

, где @ word1 равно car, а @ word2 равно wheel.

Это может быть любое количество слов, поэтому оно должно быть динамическим.

Спасибо.

Ответы [ 4 ]

1 голос
/ 15 ноября 2011

Попробуйте, @wordtable может динамически содержать все слова, которые вы хотите. и он найдет только строки из @table, где есть все слова:

declare @wordtable table(word varchar(20))
declare @table table(word varchar(500))

insert @wordtable values('car')
insert @wordtable values('wheel')

insert @table values('carwheel')
insert @table values('car')
insert @table values('wheel')
insert @table values('wheelcat')

select * from @table t
where not exists (select 1 from @wordtable where t.word not like '%' + word + '%')

«Содержит», вероятно, все равно будет лучше. Но это достойный способ решения проблемы.

1 голос
/ 15 ноября 2011

Предполагая, что это действительно слова, которые вы хотите найти, SQL Server имеет встроенный полнотекстовый поиск (http://msdn.microsoft.com/en-us/library/ms142571.aspx) - он существует не менее 8 лет. Он не идеален - и вы могли бы обосновать, что Lucene был лучше - но если ваши потребности просты, это, безусловно, делает свою работу.

Это также означает, что вы можете просто использовать готовые функции для текстового поиска, такие как "нечеткое" сопоставление.

Поскольку у вас не будет столько кода для записи, вы избежите ошибки в своем псевдокоде -

(word is like @word1)
    and (word is like @word2)

даст только результат, если слова1 и слово2 совпадают ...

0 голосов
/ 15 ноября 2011

Я бы принял во внимание то, что было сказано выше, однако, если вы все еще хотите написать sql для этого, вы можете попробовать функцию CHARINDEX

declare @searchTerms  varchar(100)
select  @searchTerms = 'WORD1,WORD2,GIRLS,BOYS'  -- some list

select  Field1, Field2 , Field3 , Field4
from    SomeTable
where   CHARINDEX( ',' + Field1 + ',', ',' + @searchTerms + ',' , 0 ) > 0 

Так что ваши searchTerms, Table и Field могут бытьесли вы хотите заменить переменные, то вы создаете SQL-оператор, который затем выполняете

0 голосов
/ 15 ноября 2011

Это будет очень медленно и не масштабируемо.Почему бы вам не подумать об использовании чего-то вроде Lucene .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...