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