2017-10-20 89 views
0

我有像“A001; A009; A011-A015; A055; B101-B104”SQL中带有两个分隔符的独立字母数字数据;和 -

的数据;只会将数据拆分成行。

+------+ 
| A001 | 
+------+ 
| A009 | 
+------+ 
| A055 | 
+------+ 

- 只会将数据拆分成行。

+------+ 
| A011 | 
+------+ 
| A012 | 
+------+ 
| A013 | 
+------+ 
| A014 | 
+------+ 
| A015 | 
+------+ 
| B101 | 
+------+ 
| B102 | 
+------+ 
| B103 | 
+------+ 
| B104 | 
+------+ 

SQL查询如何做到这一点?

+0

您的数据是非常具有挑战性的一起工作,至少可以说。你在这里有很多障碍。首先你必须把它分成分号上的行。然后你必须展开有一个 - 的行。呸。你总是有1个字符后跟3个数字,或者这只是样本数据,你的真实数据是不一致的? –

+0

这不是SQL语言的工作。这对于正则表达式或解析器来说很容易。 –

+0

是的,我正在寻找 –

回答

0

这会做虚线分割

可能创建一个表值函数返回的结果集

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

相关问题