从分隔的字符串中提取数字,具有不同的格式

时间:2018-04-23 21:24:51

标签: sql-server join

我尝试从运行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

1 个答案:

答案 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