SQL分割字符串详解

转载地址:http://www.blogjava.net/supercrsky/articles/260998.html

T-SQL对字符串的处理能力比较弱,比如我要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦。下边的函数,实现了象数组一样去处理字符串。

一,用临时表作为数组。

create functionf_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 * fromdbo.f_split( ' dfkd,dfdkdf,dfdkf,dffjk ', ' , ')

drop functionf_split
col
-- ------------------
dfkd
dfdkdf
dfdkf
dffjk


(所影响的行数为 4 行)

二、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。


CREATE functionGet_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

调用示例:
selectdbo.Get_StrArrayLength( ' 78,1,2,3 ', ' , ')

返回值:4

三、按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便
CREATE functionGet_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

调用示例:
selectdbo.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
printdbo.Get_StrArrayStrOfIndex( @str, ' , ', @next)
set @next = @next + 1
end


调用结果:
1
2
3
4
5
// -- -----------------------------------------------------------------------------------------------------------------------
selectf1,f2,f3, left(A, charindex( ' _ ',A) - 1)
from表名
order by left(A, charindex( ' _ ',A) - 1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值