SQL中带有两个分隔符的独立字母数字数据;和 -
问题描述:
我有像“A001; A009; A011-A015; A055; B101-B104”SQL中带有两个分隔符的独立字母数字数据;和 -
的数据;只会将数据拆分成行。
+------+
| A001 |
+------+
| A009 |
+------+
| A055 |
+------+
- 只会将数据拆分成行。
+------+
| A011 |
+------+
| A012 |
+------+
| A013 |
+------+
| A014 |
+------+
| A015 |
+------+
| B101 |
+------+
| B102 |
+------+
| B103 |
+------+
| B104 |
+------+
SQL查询如何做到这一点?
答
这会做虚线分割
可能创建一个表值函数返回的结果集
declare @dashed varchar(100) = 'A005-A015'
declare @start int = cast(substring(@dashed,2,3) as int)
,@end int = cast(substring(@dashed,7,3) as int)
,@prefix varchar(1) = left(@dashed,1)
declare @val int = @start
declare @t table(vals varchar(10))
while(@val<[email protected])
BEGIN
insert into @t values(@prefix + RIGHT('00'+CAST(@val as varchar(3)),3))
set @[email protected]+1
END
select * from @t
--Tally solution
--This should be done once for real and never have to do it again
declare @t2 table (num int)
declare @i int = 0
while(@i <200)
BEGIN
insert into @t2 values(@i)
set @[email protected]+1
END
select @prefix + RIGHT('00'+CAST(num as varchar(3)),3)
from @t2
where num between @start and @end
+2
理货表会比一个while循环更好。但真正的挑战是我们不知道这些是否是固定的。 –
+0
我将它添加为一个选项。 – KeithL
您的数据是非常具有挑战性的一起工作,至少可以说。你在这里有很多障碍。首先你必须把它分成分号上的行。然后你必须展开有一个 - 的行。呸。你总是有1个字符后跟3个数字,或者这只是样本数据,你的真实数据是不一致的? –
这不是SQL语言的工作。这对于正则表达式或解析器来说很容易。 –
是的,我正在寻找 –