有一种方法可以在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
和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>
完全展开,查询是:
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) + '%'
只要我们喜欢,我们可以做更多的工作来提取第4个字,第5个字,第6个字等等。但每一个进一步的价值变得比以前更复杂。
注意:我还没有试过这个解决方案,我只用数学证明了它。
'水果'看起来像什么?不要说逗号分隔的值。对于关系数据库来说,这是一个非常非常糟糕的设计。 – 2014-10-29 01:13:01
我只是用一个简单的表格来说明。 – user3015739 2014-10-29 03:28:06
您的数据结构存在根本性问题。您不应该将事物列表存储为字符串。相反,你应该使用联结表。 – 2014-10-29 10:13:49