對於平時簡單的查詢,一般使用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之后的結果集,篩選過結果。