2017-10-20 82 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

相關問題