Чтение элементов с помощью LIKE в функции, которая разделяет - PullRequest
0 голосов
/ 03 августа 2011

У меня есть запрос, который использует функцию «My_Splitter», когда я передаю строку типа

"это пример", возвращается

this
is
an
example

Проблема, с которой я столкнулся в своем запросе, заключается в том, что мне нужно взять каждое из этих значений и сделать что-то вроде

select value from My_Splitter(@MyString) where value LIKE '%this%' or value LIKE '%is%' or value LIKE '%an%' or value like '%example%'

вы поняли мою идею ... вот мой запрос

 select                 
  DISTINCT(pr.myID)            
 from                 
  myProducts pr               
  left JOIN pcategory pc ON pr.ProductId = pc.ProductId                
  left JOIN category ca on ca.categoryid = pc.categoryid       
  left join sNumber zs on zs.productid=pr.productid                
 where                 
  pr.activated = 1               
  and pr.PortalId = @PortalId                
  and (pr.Name like '%' + @Keyword + '%'  
  or pr.Name in (select value from SC_Splitter(@Keyword,' ')) //PROBLEM HERE

  or pr.myTitle LIKE '%' + @Keyword + '%' 

  or pr.PRnum LIKE '%' + @Keyword + '%'       
  or zs.snum like   '%' + @Keyword + '%' 

Я ХОЧУ, ЧТО МОЖЕТ ПРОСТО ДЕЛАТЬ

or pr.Name LIKE (select value from SC_Splitter(@Keyword,' ')) и он будет принимать любое значение из @Keywprd, поэтому поиск LIKE для каждого :( lol

Ответы [ 4 ]

2 голосов
/ 03 августа 2011

Если вы используете Полнотекстовый поиск в Microsoft SQL Server, трудности исчезнут, и ваш поиск будет на порядок быстрее.

select                 
  DISTINCT(pr.myID)            
 from                 
  myProducts pr               
  left JOIN pcategory pc ON pr.ProductId = pc.ProductId                
  left JOIN category ca on ca.categoryid = pc.categoryid       
  left join sNumber zs on zs.productid=pr.productid                
 where                 
  pr.activated = 1               
  and pr.PortalId = @PortalId                
  and (CONTAINS(pr.Name, @Keyword)  
  or FREETEXT(pr.Name, @Keyword) //NO PROBLEM HERE
  ...
1 голос
/ 03 августа 2011

Это устраняет проблему с вашим решением. Но ответ Билла Карвина - это правильное решение проблемы.

Чтобы сэкономить время и больше вопросов, это нельзя оптимизировать. Основной причиной является использование символов подстановки. Используйте полнотекстовый поиск, если вы хотите «быстро», а также «работает»

В основном, ПРИСОЕДИНЯЙТЕСЬ, используя LIKE

 select                 
  DISTINCT(pr.myID)            
 from                 
  myProducts pr               
  left JOIN pcategory pc ON pr.ProductId = pc.ProductId                
  left JOIN category ca on ca.categoryid = pc.categoryid       
  left join sNumber zs on zs.productid=pr.productid  

  JOIN 
  SC_Splitter(@Keyword,' ') CSV ON pr.Name LIKE '%' + CSV.value + '%'

 where                 
  pr.activated = 1               
  and pr.PortalId = @PortalId                
  and

--fix your parenthesis after this. 
--I'm not sure what was intended above

 (pr.Name like '%' + @Keyword + '%'  

  or pr.myTitle LIKE '%' + @Keyword + '%' 

  or pr.PRnum LIKE '%' + @Keyword + '%'       
  or zs.snum like   '%' + @Keyword + '%' 
 )
1 голос
/ 03 августа 2011

Другая возможность - использовать CROSS APPLY.

 select
  DISTINCT(pr.myID)
 from
  myProducts pr
  left JOIN pcategory pc ON pr.ProductId = pc.ProductId
  left JOIN category ca on ca.categoryid = pc.categoryid
  left join sNumber zs on zs.productid=pr.productid

  CROSS APPLY SC_Splitter(@keyword,' ') AS sentance

 where                 
  pr.activated = 1               
  and pr.PortalId = @PortalId                

  and (pr.Name like '%' + @Keyword + '%'  
      OR pr.name LIKE '%' + Sentance.Value + '%')

  or pr.myTitle LIKE '%' + @Keyword + '%'     
  or pr.PRnum LIKE '%' + @Keyword + '%'       
  or zs.snum like   '%' + @Keyword + '%' 
1 голос
/ 03 августа 2011

Я предлагаю перестроить ваш сплиттер на новую функцию, которая может принимать две строки: имя и «предложение»

тогда эта функция будет перебирать проанализированное предложение, чтобы увидеть, соответствует ли оно имени, и вернуть 1, если найден, и 0, если нет.

тогда ваш запрос будет просто иметь строку where my_new_function( name, sentence ) = 1

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