T SQL技巧收集 拆分字串

2021-06-07 09:03:21 字數 4645 閱讀 1162

在開發中,很多時候都需要處理拆分字串的操作。下面收集了幾種方法供大家分享,其中的逗號可以改為多種有需要的符號,但是不能針對多種符號同時存在的例子。有待各位補充:

將字串轉換為正規化的資料表,可以使用多種方法實現,比如前端程式處理、游標、資料庫迴圈函式,都是常用的技巧。

對於處理這些問題,比較好的思路就是使用substring函式取出字串,然後使用charindex函式定位。最後搭配排序函式完成拆分。

對於2005以後,可以使用cte來實現。另外可以自定義乙個函式處理。搭配輸入分隔符與字串,然後以table方式返回。

下面是這4種方式的示例:

備註:首先針對原始字串,可以使用bulkinsert 後者bcp命令甚至直接insert語句,把原始資料匯入資料表。以下語句是待處理的資料產生指令碼,有業務代號和業務員訂單:

為了輸出每個業務員的每筆訂單序號,所以用迴圈產生乙個資料表,儲存指定數量的序號。

接下來就是上面提到的4種方式的實現:

usetempdb go

--建立資料表儲存原始資料:

create

table

arrays (

salesid

varchar

(10)

notnull,

salesord

varchar

(8000)

notnull )

go --

注意:下面

insert

語句中逗號後面有乙個空格

insert

into

arrays

values 

('a'

,'20, 223, 2544');

insert

into

arrays

values 

('b'

,'30, 23433, 28');

insert

into

arrays

values 

('c'

,'12, 10');

insert

into

arrays

values 

('d'

,'4, 6, 45678, 2');

go --

通過迴圈產生儲存指定數量的序號的表

create

table

nums (

c1intnot

null

primary

key );

go --

產生資料

declare

@iint

set@i= 1

while

@i<= 8000

begin

insert

into

nums

values  (@i

) set@i=@i

+ 1end --

方法一:適合

2005

以上版本使用。使用

row_nubmer函式

select

salesid

[業務編號],

row_number

()over

(partition

bysalesid

order

byc1)as

[序號],

substring

(salesord,c1

,charindex

(', '

,salesord

+', ',c1

)-c1)

as[值]

from

arrays

join

nums

onc1

<=

len(

salesord)

andsubstring

(', '

+salesord,c1

, 1)

=', '

order

bysalesid,

[序號]

--方法二:適用於任何版本

select

salesid

[業務編號],

c1-len

(replace

(left(

salesord,c1

),', ',''

))+ 1 [序號]

, substring

(salesord,c1

,charindex

(', '

,salesord

+', ',c1

)-c1)

as[值]

from

arrays

join

nums

onc1

<=

len(

salesord)

andsubstring

(', '

+salesord,c1

, 1)

=', '

order

bysalesid,

[序號]

--方式三:適用於

2005

以上版本,使用

cte實現: ;

with

splitcte

as (select

salesid,

1 as

pos,

1 as

startpos,

charindex

(', '

,salesord

+', '

)- 1 as

endpos

from

dbo.

arrays

where

len(

salesord

)> 0

union

all

select

prv.

salesid,

prv.

pos+ 1 ,

prv.endpos

+ 2 ,

charindex

(', '

,cur

.salesord

+', '

,prv

.endpos

+ 2)

- 1from

splitcte

asprv

join

dbo.

arrays

ascur

oncur

.salesid

=prv

.salesid

andcharindex

(', ',

cur.

salesord +

', ',

prv.

endpos

+ 2)

> 0)

selecta.

salesidas[

業務編號],

pos[序號

],cast

(substring

(salesord

,startpos

,endpos

-startpos

+ 1)

asint)as

[值]

from

dbo.

arraysasa

join

splitcteass

ons.salesid=a

.salesid

orderbya

.salesid,

pos go

--方法

4:使用自定義函式

create

function

dbo.

fn_split

(@orders

asvarchar

(max))

returns

table as

return

selectc1-

len(

replace

(left(

@orders,c1

),', ',''

))+ 1 as[序號

],substring

(@orders,c1

,charindex

(', '

,@orders

+', ',c1

)-c1)

as[值]

from

dbo.

nums

where

c1<=

len(

@orders)

andsubstring

(', '

+@orders,c1

, 1)

=', ';

go --然後使用

技巧,合併分解字串

select

salesid,

b.*from

arraysa

cross

dbo.

fn_split(a

.salesord)b

go通過一下執行計畫的開銷可以看到cte方法的實現開銷最小,所以建議使用這種方式處理:

T SQL技巧收集 拆分字串

在開發中,很多時候都需要處理拆分字串的操作。下面收集了幾種方法供大家分享,其中的逗號可以改為多種有需要的符號,但是不能針對多種符號同時存在的例子。有待各位補充 將字串轉換為正規化的資料表,可以使用多種方法實現,比如前端程式處理 游標 資料庫迴圈函式,都是常用的技巧。對於處理這些問題,比較好的思路就是...

拆分字串

拆分乙個字串,獲取每一組的key與value。如字串 qq adf f qewr98 eer d9adf t ad34 f qewrqr u adf43 gggg 2344 按照物件導向理念來解決,建立乙個物件 這個是對物件物件,有key和value兩個特性。我們需要把拆分好的資料臨時儲存起來,現在...

拆分字串

本函式可以將 目標字串 以 指定字串 進行拆分,並通過表結構返回結果。如下 create or replace type str split is table of varchar2 4000 create or replace function splitstr p string in varch...