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