对于平时简单的查询,一般使用like就能解决问题。如果字段值不连续,使用like就有点乏力了。
在工作中遇到这种业务,特整理如下文章,如果有更高效的解决方案,也望推荐互相学习。
1.表中数据如下:select * from MyTest
2.如果搜索表中 ”苹果" 数据,很简单就能搞定:select * from MyTest where name like '%苹果%'
3.简单小升级下,业务需要查找 “苹果,香蕉” 这种在数据库连续存放的数据,还是很简单:select * from MyTest where name like '%苹果,猕猴%'
4.现在业务大升级,需要查找 “苹果,猕猴” 这种不连续的数据,并且只要符合其中一个字段值,结果集就要包含其中。
对于这种查找,最直接想法:分割字符串,循环遍历去查询。这种方式性能不说,感觉就是一坨枯燥的东西。此业务首先源于数据库
设计如此,生成环境中”大量器件编号”通过逗号分隔存放在一个字段,前端参数顺序可变,所以产出此文章,也帮助遇到类似业务的朋友。
代码先呈现:之后做分析
select distinct id,[name] from MyTest a inner join( SELECT B.tempName FROM( SELECT [value]=CONVERT(XML,'<v>'+REPLACE('苹果,猕猴',',','</v><v>')+'</v>') )xmlStr OUTER APPLY( SELECT N.v.value('.','nvarchar(100)') tempName FROM xmlStr.[value].nodes('/v') N ( v ) )B ) b on a.Name like '%'+b.tempName+'%'
结果如下:
总结:
1.先把字符串转成XML格式,例如把“苹果,猕猴” 字符串装换成“<v>苹果</v><v>猕猴</v>”XML格式
SELECT [value]=CONVERT(XML,'<v>'+REPLACE('苹果,猕猴',',','</v><v>')+'</v>')
2.核心:考虑把XML字符串分割成多行,也就是字符串转行功能。
参考文章:http://topic.csdn.net/u/20091023/17/CF3F75D1-DE50-4EE1-B9BE-43E4AF3C62EF.html
declare @xmlStr xml set @xmlStr=CONVERT(XML,'<v>'+REPLACE('苹果,猕猴',',','</v><v>')+'</v>') SELECT N.v.value('.','varchar(100)') FROM @xmlStr.nodes('/v') N ( v )
3.OUTER APPLY函数的使用。
参照文章:http://www.cnblogs.com/end/archive/2011/02/17/1957011.html
4.原数据集inner join 字符串结果集,再查询inner join之后的结果集,筛选过结果。