单位编号 | 数量 |
---|---|
#201-12/14 | 1 |
#101-34至37 | 2 |
#01-112、#01-K106 和#01-113/114 | 4 |
输出:
单位编号 | 数量 |
---|---|
#201-12 | 1 |
#201-13 | 1 |
#201-14 | 1 |
#101-34 | 2 |
#101-35 | 2 |
#101-36 | 2 |
#101-37 | 2 |
#01-112 | 4 |
#01-K106 | 4 |
#01-113 | 4 |
#01-114 | 4 |
我使用了
string_split
功能,但没有用。
在SQL Server中,我想将#101-33等数据拆分为37
所以我的输出将是
#101-33
#101-34
#101-35
#101-36
#101-37
假设您使用的是 sql server 2022 或 Azure,这将适用于您的示例数据。有多种方法可以使其在旧版本的 sql server 上工作,但提出解决方案会遇到更多障碍,因为 string_split 不会返回序数位置,并且generate_series 直到 2022 年才存在。这是非常脆弱和非常可能会损坏,因为我猜测您的源数据只是自由文本。
话虽这么说,这将与您的示例数据一起产生您想要的输出。
create table #Something
(
Unitnumber varchar(50)
, Number int
)
insert #Something values
('#201-12/14', 1)
, ('#101-34to 37', 2)
;
with parsedValues as
(
select *
from #Something s
cross apply string_split(s.Unitnumber, '-', 1) x
)
, prefix as
(
select Unitnumber = pv.Unitnumber
, prefix = pv.value
from parsedValues pv
where pv.ordinal = 1
)
, rangeEndPoints as
(
select pv.Unitnumber
, SeriesStart = min(x.value)
, SeriesEnd = max(x.value)
from parsedValues pv
cross apply string_split(replace(pv.value, 'to ', '/'), '/', 1) x --this changes the delimiter "to" into "/" so they are all the same delimiter
where pv.ordinal = 2
group by pv.Unitnumber
)
select pv.value + '-' + convert(varchar(10), x.value)
, pv.Number
from prefix p
join rangeEndPoints rep on rep.Unitnumber = p.Unitnumber
cross apply generate_series(try_convert(int, rep.SeriesStart), try_convert(int, rep.SeriesEnd), 1) x
join parsedValues pv on pv.Unitnumber = p.Unitnumber and pv.ordinal = 1
order by pv.Unitnumber
, x.value
drop table #Something