博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Sql实现Split

Posted on 2009-07-25 00:14  linFen  阅读(486)  评论(0编辑  收藏  举报

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