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项,这是确定的。。但如果我使用领带按钮,它只会返回一个。,同样,如果我使用领带按钮,它也会工作。。。但与领带不符合主题,但我希望看到一个选项,点击评论,并将其转换为小写或正楷:-这是如此干净,但它告诉我,表不能使用包含或自由文本,因为它不是全文索引,我无法对这些表进行更改:正确,如果您阅读了我链接到的文档,全文搜索需要创建一种特殊类型的索引。如果无法创建该索引,则无法使用这些搜索功能。但无论如何,这是解决问题的最好办法。问题是,随着新记录的出现或创造,我还有什么要做的吗?或者,一旦创建了索引,我就可以继续了?是的,索引会自动合并新数据。太好了,我稍后会对此进行研究以改进。。谢谢这是如此干净,但它告诉我,表不能使用包含或自由文本,因为它不是全文索引,我不能对这些表进行更改:正确,如果您阅读了我链接到的文档,全文搜索需要创建一种特殊类型的索引。如果无法创建该索引,则无法使用这些搜索功能。但无论如何,这是解决问题的最好办法。问题是,随着新记录的出现或创造,我还有什么要做的吗?或者,一旦创建了索引,我就可以继续了?是的,索引会自动合并新数据。太好了,我稍后会对此进行研究以改进。。非常感谢。