SQL - 在第N和第N个分隔符之间基于'分隔字符串'

时间:2017-04-12 21:39:45

标签: sql sql-server

我有一个带有ITEM列的ITEM表。他们都是一个字符串。此列中的一些示例产品可能是:

AAA-BBB-CCC.B.S
AAA-BBB-CCC.B.M
BAA-123A-DDDD.01.28
BAA-123A-DDDD.20.28
CCC-AACD-CCDD.MB.28.L
CCC-AACD-CCDD.MB.29.L
CCC-AACD-CCDD.FC.28.R
CCC-AACD-CCDD.FC.29.R
  • 前3个部分(用连字符分隔)是产品代码
  • 第1期和第2期之间的任何内容都是颜色
  • 第二期后但第三期之前(如果第三期实际存在)的任何内容是项目大小
  • 如果有第3个句号,则项目适合之后的任何内容(例如,腿部长度为S / R / L的牛仔裤)

我想将这些元素分成不同的列,但由于"并不总是存在,我会挣扎#34; item fit属性,以及"在x之后但在y之前#34;试图将数据分开的本质。到目前为止,我已经获得了以下内容,它可以获得项目大小,但是如果有适合的话,那么它就会得到它,这使得它不是很有用。

这是在SQL Server Management Studio 2016中。

SELECT ITEM
,RIGHT(ITEM, CHARINDEX('.',REVERSE(ITEM)) -1) 'Size'
FROM ITEM

1 个答案:

答案 0 :(得分:1)

这是一种解析和创建列的方法。但是,你失去了我的元素是什么。

示例

Declare @YourTable table (ID int,Item varchar(100))
Insert Into @YourTable values
(1,'AAA-BBB-CCC.B.S'),
(2,'AAA-BBB-CCC.B.M'),
(3,'BAA-123A-DDDD.01.28'),
(4,'BAA-123A-DDDD.20.28'),
(5,'CCC-AACD-CCDD.MB.28.L'),
(6,'CCC-AACD-CCDD.MB.29.L'),
(7,'CCC-AACD-CCDD.FC.28.R'),
(8,'CCC-AACD-CCDD.FC.29.R')

Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(replace(A.Item,'.','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

<强>返回

enter image description here