当我传递像
这样的字符串时,我有一个使用名为“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搜索:(大声笑
答案 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 + '%'
)