对于平时简单的查询,一般使用like就能解决问题。如果字段值不连续,使用like就有点乏力了。
在工作中遇到这种业务,特整理如下文章,如果有更高效的解决方案,也望推荐互相学习。
1.表中数据如下:select * from MyTest
2.如果搜索表中 ”苹果" 数据,很简单就能搞定:select * from MyTest where name like '%苹果%'
3.简单小升级下,业务需要查找 “苹果,香蕉” 这种在数据库连续存放的数据,还是很简单:select * from MyTest where name like '%苹果,猕猴%'
4.现在业务大升级,需要查找 “苹果,猕猴” 这种不连续的数据,并且只要符合其中一个字段值,结果集就要包含其中。
对于这种查找,最直接想法:分割字符串,循环遍历去查询。这种方式性能不说,感觉就是一坨枯燥的东西。此业务首先源于数据库
设计如此,生成环境中”大量器件编号”通过逗号分隔存放在一个字段,前端参数顺序可变,所以产出此文章,也帮助遇到类似业务的朋友。
代码先呈现:之后做分析
结果如下:
总结:
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之后的结果集,筛选过结果。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有