SQL里类似SPLIT的分割字符串函数

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
as
begin
 
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
 
end
 
return   @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 )
as
begin
 
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
 
end
 
if   @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

调用结果:
1
2
3
4
5
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值