sql模糊查询,字段多值模糊查询(字段分割搜索,字符串转行)


对于平时简单的查询,一般使用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之后的结果集,筛选过结果。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM