SQL分割字符串详解

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  
// -- -----------------------------------------------------------------------------------------------------------------------
select  f1,f2,f3, left (A, charindex ( ' _ ' ,A) - 1 )
from  表名 
order   by   left (A, charindex ( ' _ ' ,A) - 1 )


々上善若水々 2009-03-20 11:29 发表评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值