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