Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在拆分的函数中读取具有LIKE的项_Sql_Sql Server 2005_Sql Server 2008 - Fatal编程技术网

Sql 在拆分的函数中读取具有LIKE的项

Sql 在拆分的函数中读取具有LIKE的项,sql,sql-server-2005,sql-server-2008,Sql,Sql Server 2005,Sql Server 2008,我有一个查询,当我传递一个类似 这是一个示例,它返回 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

我有一个查询,当我传递一个类似

这是一个示例,它返回

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 + '%' 
我希望我能做到


或如“从SC中选择值”这样的pr.名称_Splitter@Keyword,它将接受@Keywprd中的任何值,因此对每个值进行类似的搜索:lol

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

然后,该函数将在已解析的句子上循环,查看它是否与名称匹配,如果找到,则返回1,如果没有,则返回0


然后,您的查询只需要一个where my_new_函数名,句子=1行

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

然后,该函数将在已解析的句子上循环,查看它是否与名称匹配,如果找到,则返回1,如果没有,则返回0

然后,您的查询将只需要一个where my_new_函数名,句子=1行

如果您在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
  ...
如果您在MicrosoftSQLServer中使用,困难就会消失,您的搜索速度将提高几个数量级

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
  ...

另一种可能是使用交叉应用

 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 + '%' 

另一种可能是使用交叉应用

 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 + '%' 

这就用你的解决方案解决了这个问题。但是比尔·卡温的答案是这个问题的正确解决方案

为了节省时间和更多问题,这是无法优化的。主要原因是前导通配符。如果您希望快速且有效,请使用全文搜索

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

这就用你的解决方案解决了这个问题。但是比尔·卡温的答案是这个问题的正确解决方案

为了节省时间和更多问题,这是无法优化的。主要原因是前导通配符。如果您希望快速且有效,请使用全文搜索

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


请用您使用的RDBMS品牌标记您的问题。SQL是一种语言,而不是一种技术产品。我猜您使用的是Microsoft SQL Server,因为您使用+进行字符串连接。添加标签sql server或sql-server-2008等。更正,关键字包含不同的名称。我想查找这些名称所在的所有ID…我正在搜索关键字,因此基本上如果我使用按钮,它将返回3项,这是确定的。。但如果我使用领带按钮,它只会返回一个。,同样,如果我使用领带按钮,它也会工作。。。但与领带不符合主题,但我希望看到一个选项,点击评论,并将其转换为小写或正楷:-请用您使用的RDBMS品牌标记您的问题。SQL是一种语言,而不是一种技术产品。我猜您使用的是Microsoft SQL Server,因为您使用+进行字符串连接。添加标签sql server或sql-server-2008等。更正,关键字包含不同的名称。我想查找这些名称所在的所有ID…我正在搜索关键字,因此基本上如果我使用按钮,它将返回3项,这是确定的。。但如果我使用领带按钮,它只会返回一个。,同样,如果我使用领带按钮,它也会工作。。。但与领带不符合主题,但我希望看到一个选项,点击评论,并将其转换为小写或正楷:-这是如此干净,但它告诉我,表不能使用包含或自由文本,因为它不是全文索引,我无法对这些表进行更改:正确,如果您阅读了我链接到的文档,全文搜索需要创建一种特殊类型的索引。如果无法创建该索引,则无法使用这些搜索功能。但无论如何,这是解决问题的最好办法。问题是,随着新记录的出现或创造,我还有什么要做的吗?或者,一旦创建了索引,我就可以继续了?是的,索引会自动合并新数据。太好了,我稍后会对此进行研究以改进。。谢谢这是如此干净,但它告诉我,表不能使用包含或自由文本,因为它不是全文索引,我不能对这些表进行更改:正确,如果您阅读了我链接到的文档,全文搜索需要创建一种特殊类型的索引。如果无法创建该索引,则无法使用这些搜索功能。但无论如何,这是解决问题的最好办法。问题是,随着新记录的出现或创造,我还有什么要做的吗?或者,一旦创建了索引,我就可以继续了?是的,索引会自动合并新数据。太好了,我稍后会对此进行研究以改进。。非常感谢。