SQL分割字串

2021-06-02 01:09:57 字數 3249 閱讀 7106

[**]

t-sql對字串的處理能力比較弱,比如我要迴圈遍歷象1,2,3,4,5這樣的字串,如果用陣列的話,遍歷很簡單,但是t-sql不支援陣列,所以處理下來比較麻煩。下邊的函式,實現了象陣列一樣去處理字串。

一,用臨時表作為陣列

create   function   f_split(@c   varchar(2000),@split   varchar(2))   

returns @t table(col varchar(20))

as

begin

while(charindex(@split,@c)<>0)

begin

insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))

set @c = stuff(@c,1,charindex(@split,@c),'')

end

insert @t(col) values (@c)

return

end

go

select * from dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk',',')

drop function f_split

col

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

dfkd

dfdkdf

dfdkf

dffjk

(所影響的行數為   4   行)

二、按指定符號分割字串,返回分割後的元素個數,方法很簡單,就是看字串中存在多少個分隔符號,然後再加一,就是要求的結果。

create function get_strarraylength

( @str varchar(1024), --要分割的字串

@split varchar(10) --分隔符號

)returns int

asbegin

declare @location int

declare @start int

declare @length int

set @str=ltrim(rtrim(@str))

set @location=charindex(@split,@str)

set @length=1

while @location<>0

begin

set @start=@location+1

set @location=charindex(@split,@str,@start)

set @length=@length+1

endreturn @length

end

呼叫示例:select dbo.get_strarraylength('78,1,2,3',',')

返回值:4

三、按指定符號分割字串,返回分割後指定索引的第幾個元素,象陣列一樣方便

create function get_strarraystrofindex

( @str varchar(1024), --要分割的字串

@split varchar(10), --分隔符號

@index int --取第幾個元素

)returns varchar(1024)

asbegin

declare @location int

declare @start int

declare @next int

declare @seed int

set @str=ltrim(rtrim(@str))

set @start=1

set @next=1

set @seed=len(@split)

set @location=charindex(@split,@str)

while @location<>0 and @index>@next

begin

set @start=@location+@seed

set @location=charindex(@split,@str,@start)

set @next=@next+1

endif @location =0 select @location =len(@str)+1

--這兒存在兩種情況:1、字串不存在分隔符號 2、字串中存在分隔符號,跳出while迴圈後,@location為0,那預設為字串後邊有乙個分隔符號。

return substring(@str,@start,@location-@start)

end

呼叫示例:select dbo.get_strarraystrofindex('8,9,4',',',2)

返回值:9

三、結合上邊兩個函式,象陣列一樣遍歷字串中的元素

declare @str varchar(50)

set @str='1,2,3,4,5'

declare @next int

set @next=1

while @next<=dbo.get_strarraylength(@str,',')

begin

print dbo.get_strarraystrofindex(@str,',',@next)

set @next=@next+1

end呼叫結果:12

345

但是真要用到查詢語句裡面可就比較麻煩了,例如

表t1col1

col2

a美國,法國,英國,美國,日本,南韓,日本

b朝鮮,緬甸,緬甸

我想得到的結果是

col1

col2a美國

a法國a英國

a日本a南韓

b朝鮮b緬甸

例如我去引用函式

select col1,col2=(select col from f_split(col2,',')) from t1

他就會報乙個錯誤

子查詢返回的值不止乙個。當子查詢跟隨在 =、!=、<、<=、>、>= 之後,或子查詢用作表示式時,這種情況是不允許的。

SQL分割字串

if object id dbo.fn split isnot null drop function dbo.fn split gocreate function dbo.fn split inputstr varchar 8000 seprator varchar 10 returns temp ...

SQL 字串分割函式

create function dbo f split sourcesql varchar 8000 strseprate varchar 10 returns temp table a varchar 100 as begin declare iint set sourcesql rtrim lt...

SQL分割字串儲存

create function dbo.fn pmt pis splitstr sourcesql varchar 8000 strseprate varchar 10 returns temp table customer int as begin declare i int set source...