TSQL - 使用LIKE进行多个值的部分匹配

时间:2014-10-29 01:11:40

标签: sql sql-server tsql

我想征求您的意见,SQL服务器中是否允许我对值列表执行部分匹配?

需要匹配的整个字符串将通过存储过程传递。

我在编写自己的函数之前尝试找到其他替代方法,用逗号分割字符串,然后在将数据返回给程序之前将所有结果联合起来。

例如,我会将以下字符串传递给我的TSQL

  

苹果,桔子,梨

在我的WHERE子句中应该匹配

select * from store where fruits like 'apple%'
select * from store where fruits like 'orange%'
select * from store where fruits like 'pear%'

我可以在单个SQL语句中实现上述结果,而不是编写函数来打破每个字符串吗?

  

我的表中的数据

apple red
apple green
orange sweet
orange sour
pear big
pear small

所以,当我传入字符串" apple,pear" ,我需要返回

apple red
apple green
pear big
pear small

6 个答案:

答案 0 :(得分:9)

您可以将临时表创建为

'CREATE TABLE #Pattern (
      SearchItems VARCHAR(20)
    );'

附注:确保检查临时表是否存在以避免错误。 现在,您可以将搜索词插入临时表

'INSERT 
    INTO #Pattern 
    VALUES 
        ('% APPLE %'),
        ('% ORANGE %'),
        ('% BANANA %');'

现在使用此临时表,使用INNER JOIN搜索您的表 喜欢

'SELECT *
 FROM Store
 INNER JOIN #Pattern
    ON Store.Fruits LIKE SearchItems
'

作为一个注释,临时表是我试图避免的主要内容,但在这里它很方便,我使用这个解决方案的情况并不是要求性能。相反,它可以更容易地保持不断增长的searchItems。

希望这也适用于其他人。

答案 1 :(得分:1)

试试这个,但性能不会很好

declare @parm varchar(200)
set @parm = ','+'apple,orange,pear'+','

select * from store where charindex(fruit,@parm) > 0

答案 2 :(得分:1)

可能很简单:

SELECT
  *
FROM
  store
WHERE
  fruits LIKE 'apple%'
  OR fruits LIKE 'orange%'
  OR fruits LIKE 'pear%'

答案 3 :(得分:0)

在这里找到关于如何使用XML进行拆分的答案。

我只是将值插入表中然后查询它。

http://blogs.msdn.com/b/amitjet/archive/2009/12/11/sql-server-comma-separated-string-to-table.aspx

答案 4 :(得分:0)

试试这个(全文搜索):

SELECT  *
FROM store
WHERE CONTAINS(fruits , '"apple*" OR "orange*" OR "pear*"')

以下是帮助实施:

http://msdn.microsoft.com/en-us/library/ms142571.aspx

答案 5 :(得分:-1)

有一种方法可以在SQL中完成它,但它非常复杂。假设您可以使用匹配最多三个水果名称的字符串,您可以按以下方式进行操作。

我们假设@fruits是包含水果列表的varchar变量,我们追加更多逗号分隔符(如果它包含少于三个水果名称):

declare @fruits varchar(80);
set @fruits = <list of fruits passed in> + ',_,_,_,';

以下等式不是SQL,而是like表达式需要的子字符串操作背后的数学运算:

NOTE: NOT SQL

First fruit word:
p1 = charindex(',', @fruits)            << position of ',' delimiter
v1 = substring(@fruits, 0, p1-1) + '%'  << fruit word we seek
r1 = substring(@fruits, p1+1)           << remainder of string

Second fruit word:    
p2 = charindex(',', r1)
v2 = substring(r1, 0, p2-1) + '%'
r2 = substring(r1, p2+1)

Third fruit word:
p3 = charindex(',', r2)
v3 = substring(r2, 0, p3-1) + '%'
r3 = substring(r2, p3+1)

...and so on...

现在,我们将p1v1r1的第一个值替换为p2v2和{{的第二组方程式1}}。同样,我们将第二组值替换为第三组,依此类推。我们最终得到r2v1v2的这些怪物:

v3

这些是我们需要查找的前三个v1 = substring(@fruits, 0, charindex(',', @fruits)-1) + '%' v2 = substring(substring(@fruits, charindex(',', @fruits)+1), 0, charindex(',', substring(@fruits, charindex(',', @fruits)+1))-1) + '%' v3 = substring(substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1), 0, charindex(',', substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1))-1) + '%' 值:

LIKE

完全展开,查询为:

select * from fruits
where fruit like <v1>
   or fruit like <v2>
   or fruit like <v3>

我们可以做更多工作来提取第4个单词,第5个单词,第6个单词,等等。但是每个select * from fruits where fruit like substring(@fruits, 0, charindex(',', @fruits)-1) + '%' or fruit like substring(substring(@fruits, charindex(',', @fruits)+1), 0, charindex(',', substring(@fruits, charindex(',', @fruits)+1))-1) + '%' or fruit like substring(substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1), 0, charindex(',', substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1))-1) + '%' 值进一步变得比前一个值复杂得多。

注意:我没有尝试过这个解决方案,我只是用数学方法证明了这一点。