用SQL将连续相同的字符压缩成一个字符

/*
    reduce the consecutive characters alike into single one
    WinXP, SQL Server 2K
*/

if object_id('fn_unicate') is not null
    drop function fn_unicate
go

create function dbo.fn_unicate(
    @string nvarchar(200), -- the string to be operated on
    @target nvarchar(10)) -- the target characters to be compressed (null and empty string meas compress all)
    returns nvarchar(200)
as
begin
declare @t table(c nvarchar(100))
declare @i int, @value nvarchar(100), @ret nvarchar(200)

select @i = 2, @value = left(@string, 1), @ret = ''

while @i <= len(@string)
begin
    if right(@value, 1) <> substring(@string, @i, 1)
    begin
        insert @t select @value
        select @value = ''
    end
    select @value = @value + substring(@string, @i, 1), @i = @i + 1
end

select @ret = @ret +
    case when isnull(@target, '') = '' then left(c,1)
        when charindex(left(c,1), @target) > 0 then left(c, 1)
        else c end
    from @t
return @ret
end
go

declare @s nvarchar(200)
set @s = 'aaabcckkkkkaaaaaairrrrr'
print 'original string = ' + @s
print dbo.fn_unicate(@s, '')
print dbo.fn_unicate(@s, null)
print dbo.fn_unicate(@s, 'k') -- compress 'k'
print dbo.fn_unicate(@s, 'ar') -- compress 'a' and 'r'

print dbo.fn_unicate('', '') + 'test'
print dbo.fn_unicate(null, '') + 'test2'
go

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值