sql 截取
/*有時候我們需要將如下字符串進行分割'1,12,123'希望得到這樣的結果:112123這里借助master.dbo.spt_values表來實現!*/--準備數據
IF OBJECT_ID('tempdb..#a') IS NOT NULL DROP TABLE #a
SELECT '1,12,123' AS ids INTO #a--截取一個字符串需要知道開始位置和截取長度--1.尋找截取的開始位置/*很明顯對于這個字符串的開始截取位置是1(從第一個字符開始截取),那么嘗試從位置1開始截取,每次截取1個字符使用SUBSTRING(a.ids,b.number,1)后可以看到字符串的每個字符都被截取成單個的字符(一共8個字符)但是要截取兩位,三位的字符就得計算截取長度了*/--2.計算截取的長度/*分別截取1,12,123這三個數字1,12,123SUBSTRING(ids,1,1)----1 SUBSTRING(ids,3,2)----12SUBSTRING(ids,6,3)----123兩個問題:1.怎么獲取開始截取位置?2.怎么計算截取長度?解決第一個問題,可以通過加一個條件來篩選b.number,我們只需要1,3,6的值再看看這個字符串'1,12,123' 逗號所在的位置為:2,5試試在字符串'1,12,123' 前面加個逗號 ',1,12,123' 這時逗號的位置是:1,3,6ok開始位置就拿到了,加個條件實現:AND SUBSTRING(','+a.ids,b.number,1)=','看看效果:ids number-------- -----------1,12,123 11,12,123 31,12,123 6解決第二個問題:我們知道截取長度分別是1,2,3 怎么計算?我們再來看看每個逗號的位置,以及number的數值ids number 逗號位置-------- ----------- -----------1,12,123 1 21,12,123 3 51,12,123 6 0發現逗號位置減去number將得到結果:1,2,-6還差一點,如果逗號位置的最后一個數值是9就好了,怎么辦?試試往后再加一個逗號看看:'1,12,123,'現在最后一個逗號的位置就是9了吧!逗號位置:CHARINDEX(',',a.ids+',',b.number)截取長度:CHARINDEX(',',a.ids+',',b.number)-b.number這樣我們就可以計算截取長度了:ids number 逗號位置 截取長度-------- ----------- ----------- -----------1,12,123 1 2 11,12,123 3 5 21,12,123 6 9 3截取的時候,從number開始,按截取長度來截取將是:ids number -------- ----------- --------1,12,123 1 11,12,123 3 121,12,123 6 123*/GO
SELECT a.*,b.number,
SUBSTRING(a.ids,b.number,CHARINDEX(',',a.ids+',',b.number)-b.number
)
FROM #a a,spt_values b
WHERE b.type='P'
AND b.number BETWEEN 1 and LEN(a.ids)
AND SUBSTRING(','+a.ids,b.number,1)=','
總結
- 上一篇: 乱序字典加密解密python基础知识综合
- 下一篇: go语言学习笔记——godoc的使用(超