如何分隔包含范围的管道分隔列?
问题描述:
我有一个SQL表,其中包含一个管道分隔的字符串的列和一些管道之间的元素是191087..191089
范围。我需要将这些值分成列表,如果元素是一个范围,我需要列出整个范围。例如,如果元素是191087..191089
,我需要列出191087,191088,191089
。如何分隔包含范围的管道分隔列?
我能够使用下面的代码将列值拆分为行,我在代码项目中找到'ksababa'并修改了一下,但我需要帮助进一步分割范围并列出所有作为数据集的一部分返回的值之间的值。
CREATE FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (items varchar(8000))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
--#### Test data to play with
create table #test (
data varchar(1000),
fUND varchar(50)
)
go
insert into #test values
('Data|asdsad|sad','01')
insert into #test values
('1012|1032|1127|1134|1136|1138..1139|1141|1200..1212|1214..1223|1921|5315','09')
go
--#### Cursor to list elements values of each value of fund.
Declare c Cursor For Select Distinct fUND From #test t
Open c
DECLARE @Fund varchar(10);
create table #test1 (
Fund varchar(10),
Element varchar(10)
)
Fetch next From c into @Fund
While @@Fetch_Status=0 Begin
DECLARE @SUH VARCHAR(2000);
SET @SUH=(Select data from #test where fUND= @Fund);
insert into #test1
select @Fund , * from dbo.Split(@SUH,'|')
Fetch next From c into @Fund
End
Select * From #test1
Drop table #test1
Close c
Deallocate c
答
对于范围,我认为你需要使用数字表或理货表。然后你可以加入第一个和最后一个值,并从那里获得整个范围。
你可以找到例子在那里理货表,这也被在DelimitedSplit8k使用:
+0
欲了解更多深入了解Tally表的信息,请参阅Jeff在SSC的文章。 http://www.sqlservercentral.com/articles/T-SQL/62867/ – 2015-02-05 19:55:55
使用DelimitedSplit8k杰夫MODEN可能是一个更好的主意,它的速度快了很多,请参阅http: //www.sqlservercentral.com/articles/Tally+Table/72993/(代码发现很慢) – 2015-02-05 19:45:44