我想征求您的意见,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
答案 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*"')
以下是帮助实施:
答案 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...
现在,我们将p1
,v1
和r1
的第一个值替换为p2
,v2
和{{的第二组方程式1}}。同样,我们将第二组值替换为第三组,依此类推。我们最终得到r2
,v1
和v2
的这些怪物:
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) + '%'
值进一步变得比前一个值复杂得多。
注意:我没有尝试过这个解决方案,我只是用数学方法证明了这一点。