在分割的函数中使用LIKE读取项目

时间:2011-08-03 15:40:55

标签: sql sql-server-2005 sql-server-2008

当我传递像

这样的字符串时,我有一个使用名为“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搜索:(大声笑

4 个答案:

答案 0 :(得分:2)

如果您在Microsoft SQL Server中使用Full-Text Search,则难度会消失,您的搜索速度会提高几个数量级。

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 :(得分:1)

我建议将分割器重构为一个可以接受两个字符串的新函数,即名称和“句子”

然后该函数将遍历解析的句子以查看它是否与名称匹配,如果找到则返回1,如果不匹配则返回0.

然后您的查询只会有where my_new_function( name, sentence ) = 1

答案 2 :(得分:1)

另一种可能性是使用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 + '%' 

答案 3 :(得分:1)

这解决了您的解决方案的问题。但Bill Karwin的答案是该问题的正确的解决方案。

为了节省时间和更多问题,这无法进行优化。主要原因是领先的通配符。如果您想要“快速”以及“正常工作”,请使用全文搜索

基本上,使用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 + '%' 
 )