2017-04-12 24 views
1

我有一個ITEM表和一個ITEM列。他們都是一個字符串。一些示例性的產品在此列可以是:SQL - 基於'位於第N和第N個分隔符之間的單獨字符串'

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份(用連字符分隔)是產品代碼
  • 任何在第一和第二週期之間的顏色
  • 第二階段之後但第三階段之前(如果第三階段實際存在)的任何內容是項目大小
  • 如果存在第三階段,那麼之後的任何內容都是item fit(例如:牛仔褲與S/R/L腿長)

我想分開這些元素到單獨的列,但我掙扎由於「不總是存在」項適合屬性,以及「在x之後但在y之前「試圖將數據分離的本質。到目前爲止,我已經得到了下面的內容,它可以獲得項目的大小,但是如果有一個合適的禮物,那麼它會得到它,這使得它不是很有用。

這是在SQL Server Management Studio中2016年

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

回答

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

+0

這絕對完美的作品,非常感謝! – Smeghead

+0

@Smeghead快樂它幫助 –

+0

對不起,我遇到了另一個道路顛簸與這些數據。 我們也有類似襯衫和鞋子的東西,只有一半大小,令人討厭的是這些也被分割了一段時間,但最終並不合適,例如[AAA-BBB-CCC.BLK.16.5]的大小應該是' 16.5'襯衫。 有沒有什麼方法可以有條件地分割它,所以「IF I.ITEM LIKE'%。%。%。5'分成5列,ELSE分成6列」? 我試着用2個OUTER APPLY語句作爲2個場景,但是分成5列的那些只是在這些列中返回NULL。 – Smeghead

相關問題