比如下面一串字符,把连续的数字使用“-”连接起来。
declare @source nvarchar(max) = n'1,2,3,5,6,7,9,10,33,34,35,36,37,100,101,102,103,104,111,142,137,188,189,200,205,206'
结果要求如下:
解决问题,insus.net创建2个自定义函数:
set ansi_nulls on
go
set quoted_identifier on
go
-- =============================================
-- author: insus.net
-- create date: 2019-05-27
-- update date: 2019-05-27
-- description: 分割字符串
-- =============================================
create function [dbo].[tvf_splitstringastwofield]
(
@source nvarchar(max)
)
returns @returnresult table
(
[from] int not null,
[to] int not null
)
as
begin
set @source = @source + n',';
if charindex(',',@source) > 0
begin
while charindex(',', @source) > 0
begin
declare @cutoutstring nvarchar(max) = substring(@source, 0, charindex(',', @source))
set @source = ltrim(rtrim(substring(@source, charindex(',', @source) + 1, len(@source))))
declare @from int,@to int
select top 1 @from = [from], @to = ([to]) from @returnresult order by [from] desc
if @from is null and @to is null
insert into @returnresult ([from],[to]) values(@cutoutstring,@cutoutstring)
else
begin
if @to + 1 = cast(@cutoutstring as int)
update @returnresult set [to] = @cutoutstring where [from] = @from
else
insert into @returnresult ([from],[to]) values(@cutoutstring,@cutoutstring)
end
end
end
else
insert into @returnresult ([from],[to]) values(@source,@source)
return
end
go
另一个函数:
set ansi_nulls on
go
set quoted_identifier on
go
-- =============================================
-- author: insus.net
-- create date: 2019-05-27
-- update date: 2019-05-27
-- description: 两个字段合并为一个
create function [dbo].[svf_twofieldmergedtoone] (
@field1 nvarchar(max),
@field2 nvarchar(max)
)
returns nvarchar(max)
as
begin
declare @rtv nvarchar(max)
if len(isnull(@field1,n'')) > 0 and len(isnull(@field2,n'')) > 0
begin
if @field1 = @field2
set @rtv = @field1
else
set @rtv = @field1 + n'-' + @field2
end
else if len(isnull(@field1,n'')) > 0 and len(isnull(@field2,n'')) = 0
set @rtv = @field1
else if len(isnull(@field1,n'')) = 0 and len(isnull(@field2,n'')) > 0
set @rtv = @field2
else
set @rtv = n''
return @rtv
end
go
最后实现如下:
;with t as
(
select [from],[to] from [dbo].[tvf_splitstringastwofield](@source)
)
select [from],[to],[dbo].[svf_twofieldmergedtoone]([from],[to]) as [result]
from t
go