SQL 擷取的另一種方法

2022-03-31 09:13:31 字數 2726 閱讀 5101

有時候我們需要將如下結果集中的ids進行分割

ids

--------

1,12,123

(1 行受影響)

希望得到這樣的結果:

--

------112

123(

3 行受影響)

之前一直用表值函式來擷取,這裡借助master.dbo.spt_values表來實現! 

準備資料:

if

object_id('

tempdb..#a

') is

notnull

drop

table

#aselect

'1,12,123

'as ids into #a

當我們在使用substring()擷取時,需要提供三個引數:

expression 是字串、二進位制字串、文字、影象、列或包含列的表示式。不要使用包含聚合函式的表示式。

start 指定子字串開始位置的整數。start 可以為bigint型別。

length 乙個正整數,指定要返回的 expression 的字元數或位元組數。如果 length

為負,則會返回錯誤。length

可以是bigint型別。

因此需要找到「指定子字串開始位置」和「擷取的長度」

1.尋找擷取的開始位置

很明顯對於這個字串的開始擷取位置是1(從第乙個字元開始擷取),那麼嘗試從位置1開始擷取,每次擷取1個字元

使用substring(a.ids,b.number,1)後可以看到字串的每個字元都被擷取成單個的字元(一共8個字元)

但是要擷取兩位,三位的字元就得計算擷取長度了

2.計算擷取的長度 

分別擷取1,12,123這三個數字

1,12,123

substring(ids,1,1)--

--1

substring(ids,3,2)--

--12

substring(ids,6,3)--

--123

兩個問題:1.怎麼獲取開始擷取位置? 2.怎麼計算擷取長度?

解決第乙個問題:可以通過加乙個條件來篩選b.number,我們只需要1,3,6的值

再看看這個字串'1,12,123' 逗號所在的位置為:2,5

試試在字串'1,12,123' 前面加個逗號 ',1,12,123' 這時逗號的位置是:1,3,6

ok開始位置就拿到了,加個條件實現: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,12312

1,12,12335

1,12,123

60

發現逗號位置減去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,12312

11,12,12335

21,12,12369

3

擷取的時候,從number開始,按擷取長度來擷取將是:

ids      number

-------- ----------- --------

1,12,12311

1,12,123312

1,12,123

6123

完整語句:

1go2

select a.*,b.number,3

substring(a.ids,b.number,4

charindex('

,',a.ids+',

',b.number)-b.number5)

6from

#a a,spt_values b

7where b.type='p

'8and b.number

between

1and

len(a.ids)

9and

substring(','

+a.ids,b.number,1)=',

'

view code

2000人群:asp.net mvc 

30977070

SQL行列轉換的另一種方法

create table tb 姓名 varchar 10 課程 varchar 10 分數 int insert into tb values 張三 語文 74 insert into tb values 張三 數學 83 insert into tb values 張三 物理 93 insert...

動態XtraReports的另一種方法

昨晚一下忘了,昨天在一籌莫展的情況下,有一位好心 小土豆 遠端協助,實操指導了另外一種動態xtrareports方法。因為是他幫我寫的 我就不貼了。簡單說一下方法思路。在xtrareports資料欄內加入乙個gridcontrol1,將其dock設為fill。然後還是在xtrareports的建構函...

使索引失效的另一種方法

使索引失效的另一種方法 我們可以使用hints使索引失效,但有時候我們可以使用另外一種方法來更靈活的限制索引的使用。假設我們有表test id number,name varchar 20 在表上建立了索引ix test id,ix test name。在表上的資料有 sql select from...