sql 拆解函式 各種字串分拆處理函式 sql

2021-10-17 02:20:29 字數 4500 閱讀 1404

--各種字串分函式

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))

drop function [dbo].[f_splitstr]

go--3.2.1 迴圈擷取法

create function f_splitstr(

@s   varchar(8000),   --待分拆的字串

@split varchar(10)     --資料分隔符

)returns @re table(col varchar(100))

asbegin

declare @splitlen int

set @splitlen=len(@split+'a')-2

while charindex(@split,@s)>0

begin

insert @re values(left(@s,charindex(@split,@s)-1))

set @s=stuff(@s,1,charindex(@split,@s)+@splitlen,'')

endinsert @re values(@s)

return

endgo

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))

drop function [dbo].[f_splitstr]

go--3.2.3.1 使用臨時性分拆輔助表法

create function f_splitstr(

@s   varchar(8000),  --待分拆的字串

@split varchar(10)     --資料分隔符

)returns @re table(col varchar(100))

asbegin

--建立分拆處理的輔助表(使用者定義函式中只能操作表變數)

declare @t table(id int identity,b bit)

insert @t(b) select top 8000 0 from syscolumns a,syscolumns b

insert @re select substring(@s,id,charindex(@split,@s+@split,id)-id)

from @t

where id<=len(@s+'a')

and charindex(@split,@split+@s,id)=id

return

endgo

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))

drop function [dbo].[f_splitstr]

goif exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[tb_splitstr]') and objectproperty(id,n'isusertable')=1)

drop table [dbo].[tb_splitstr]

go--3.2.3.2 使用永久性分拆輔助表法

--字串分拆輔助表

select top 8000 id=identity(int,1,1) into dbo.tb_splitstr

from syscolumns a,syscolumns b

go--字串分拆處理函式

create function f_splitstr(

@s     varchar(8000),  --待分拆的字串

@split  varchar(10)     --資料分隔符

)returns table

asreturn(

select col=cast(substring(@s,id,charindex(@split,@s+@split,id)-id) as varchar(100))

from tb_splitstr

where id<=len(@s+'a')

and charindex(@split,@split+@s,id)=id)

goif exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))

drop function [dbo].[f_splitstr]

go--3.2.5 將資料項按數字與非數字再次拆份

create function f_splitstr(

@s   varchar(8000),    --待分拆的字串

@split varchar(10)     --資料分隔符

)returns @re table(no varchar(100),value varchar(20))

asbegin

--建立分拆處理的輔助表(使用者定義函式中只能操作表變數)

declare @t table(id int identity,b bit)

insert @t(b) select top 8000 0 from syscolumns a,syscolumns b

insert @re

select no=reverse(stuff(col,1,patindex('%[^-^.^0-9]%',col+'a')-1,'')),

value=reverse(left(col,patindex('%[^-^.^0-9]%',col+'a')-1))

from(

select col=reverse(substring(@s,id,charindex(@split,@s+@split,id)-id))

from @t

where id<=len(@s+'a')

and charindex(@split,@split+@s,id)=id)a

return

endgo

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))

drop function [dbo].[f_splitstr]

go--3.2.6 分拆簡訊資料

create function f_splitstr(@s varchar(8000))

returns @re table(split varchar(10),value varchar(100))

asbegin

declare @splits table(split varchar(10),splitlen as len(split))

insert @splits(split)

select 'ac' union all

select 'bc' union all

select 'cc' union all

select 'dc'

declare @pos1 int,@pos2 int,@split varchar(10),@splitlen int

select top 1

@pos1=1,@split=split,@splitlen=splitlen

from @splits

where @s like split+'%'

while @pos1>0

begin

select top 1

@pos2=charindex(split,@s,@splitlen+1)

from @splits

where charindex(split,@s,@splitlen+1)>0

order by charindex(split,@s,@splitlen+1)

if @@rowcount=0

begin

insert @re values(@split,stuff(@s,1,@splitlen,''))

return

endelse

begin

insert @re values(@split,substring(@s,@splitlen+1,@pos2-@splitlen-1))

select top 1

@pos1=1,@split=split,@splitlen=splitlen,@s=stuff(@s,1,@pos2-1,'')

from @splits

where stuff(@s,1,@pos2-1,'') like split+'%'

endend

return

endgo

簡訊字串分拆

分拆簡訊中的資料 問題描述 根據自定義資訊字首表 每個資訊字首可以看作是乙個資訊分隔符 進行字串分拆處理的函式,在分拆處理函式中,首先定義了乙個資訊前緣表 splits,表中包含了ac bc cc dc四個資訊字首 實際使用時,可以在函式中新增其他資訊前緣,也可以定義乙個正式表來儲存資訊字首資料,這...

簡訊字串分拆

分拆簡訊中的資料 問題描述 根據自定義資訊字首表 每個資訊字首可以看作是乙個資訊分隔符 進行字串分拆處理的函式,在分拆處理函式中,首先定義了乙個資訊前緣表 splits,表中包含了ac bc cc dc四個資訊字首 實際使用時,可以在函式中新增其他資訊前緣,也可以定義乙個正式表來儲存資訊字首資料,這...

簡訊字串分拆

分拆簡訊中的資料 問題描述 根據自定義資訊字首表 每個資訊字首可以看作是乙個資訊分隔符 進行字串分拆處理的函式,在分拆處理函式中,首先定義了乙個資訊前緣表 splits,表中包含了ac bc cc dc四個資訊字首 實際使用時,可以在函式中新增其他資訊前緣,也可以定義乙個正式表來儲存資訊字首資料,這...