Sql实现Split
create function [dbo].[Get_StrArrayLength]
(
@str varchar(max), --要分割的字符串
@split varchar(10) --分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
--去掉前后空格
set @str=ltrim(rtrim(@str))
--分隔符第一次出现的位置
set @location=charindex(@split,@str)
--设置分隔后的字符串长度为1
set @length=1
while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end
drop function [dbo].[Get_StrArrayStrOfIndex]
go
create function [dbo].[Get_StrArrayStrOfIndex]
(
@str varchar(max), --要分割的字符串
@split varchar(10), --分隔符号
@index int --取第几个元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
declare @pos int
if @index<=0
return ''
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @pos=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next and @pos<@index
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
set @pos=@pos+1
end
if @location =0
if @pos<>@index
return ''
else
select @location =len(@str)+1
--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
return substring(@str,@start,@location-@start)
end
declare @id varchar(30)
select @id=dbo.Get_StrArrayStrOfIndex('4321,2223,333,5554',',',2)
我的改进版本,可像Hashtable一样访问
drop function [dbo].[Get_ArrayStrOfName]
Go
create function [dbo].[Get_ArrayStrOfName]
(
@str varchar(5000), --要分割的字符串
@split varchar(1), --分隔符号
@itemSplit varchar(1), --元素分割符
@item varchar(20) --取哪个元素
)
returns varchar(1024)
As
Begin
declare @location int --找到子串的位置
declare @tempItem varchar(50) --当前项
declare @tempItemName varchar(20) --当前项的名称
set @str=ltrim(rtrim(@str))
set @tempItem=''
set @tempItemName=''
while len(@str)>0
Begin
-----找到一个子项--
set @location=charindex(@split,@str,1)
if @location>0
Begin
set @tempItem=substring(@str,1,@location-1)
set @str=substring(@str,@location+1,len(@str))
End
Else
Begin
set @tempItem=@str
set @str=''
end
----------判断当前子项的名称--------------
set @location=charindex(@itemSplit,@tempItem,1)
if @location>0
Begin
set @tempItemName=substring(@tempItem,1,@location-1)
if @tempItemName=@item
return substring(@tempItem,@location+1,len(@tempItem))
End
End
return ''
End
Go
declare @id varchar(30)
select @id=dbo.Get_ArrayStrOfName('ff@4321,ffg@2223,ggg@333,ddd@5554', ',', '@', 'ff')
print @id