我有一个带有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
我想将这些元素分成不同的列,但由于"并不总是存在,我会挣扎#34; item fit属性,以及"在x之后但在y之前#34;试图将数据分开的本质。到目前为止,我已经获得了以下内容,它可以获得项目大小,但是如果有适合的话,那么它就会得到它,这使得它不是很有用。
这是在SQL Server Management Studio 2016中。
SELECT ITEM
,RIGHT(ITEM, CHARINDEX('.',REVERSE(ITEM)) -1) 'Size'
FROM ITEM
答案 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
<强>返回强>