我尝试从运行SQL Server 2014的ERP系统中加入两个表dict = {1: 1, 4: 2, 5: 3, 6: 4}
list=[]
for key, value in dict.items():
i = 0
while i < value:
list.append(key)
i+=1
print(list)
和OrderLines
。它的工作方式是,如果将产品添加到订单中并且该产品没有任何库存,生产条目&#34; (本质上是物料清单)是为生产自动生成的。
Production
表中的GeneratedEntries
字段捕获该数据,记录为该订单行生成的生产条目编号。字段通常采用以下格式:它以OrderLines
开头,后跟一个条目编号,后续条目编号由另一个代字号PD~
分隔。因此,对于导致生成2个条目号的订单行,此字段的标准值可能如下所示:
~
问题是,该字段的格式有时不一致,因为有时会出现拖尾,有时PD~12345~67891
会在字符串的中间重复,其他额外的垃圾字符等等。
我不知道如何从PD~
中提取条目号以加入这两个表,这种方式适用于所有格式化的可能性。有没有办法做到这一点?
下面有相关列的示例表(OrderNumber和Product并不是真正相关的,只是用于上下文......)
GeneratedEntries
答案 0 :(得分:1)
几乎任何解析/拆分功能都可以。这是一种内联方法。
唯一的技巧是我们用〜替换任何SPACE并使用try_convert()过滤
示例强>
Declare @YourTable Table ([OrderNumber] varchar(50),[Product] varchar(50),[GeneratedEntries] varchar(50))
Insert Into @YourTable Values
(1,'A','PD~10005')
,(1,'B','PD~10006~')
,(1,'C','PD~10007~10008~10009')
,(2,'R','PD~10010~~10011')
,(2,'L','~PD~10012~~')
,(2,'Z','PD~10013 PD~10014')
Select A.OrderNumber
,A.Product
,B.*
From @YourTable A
Cross Apply (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace(replace([GeneratedEntries],' ','~'),'~','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B
Where try_convert(int,B.RetVal) is not null
我保留了序列RetSeq
以防它重要。
<强>返回强>
OrderNumber Product RetSeq RetVal
1 A 2 10005
1 B 2 10006
1 C 2 10007
1 C 3 10008
1 C 4 10009
2 R 2 10010
2 R 4 10011
2 L 3 10012
2 Z 2 10013
2 Z 4 10014