我有一列看起来像这样的数据:
xy w12,jwwx , mpp w,a n p ,234567
请注意,这些项目是csv,很容易分离;但是我还有其他一些要求,这使这变得更加困难。
我需要将分割字符串(包括逗号之间的所有空格)排成一行。
当然,最后一个要求是,这些字符串中的每个字符串也都应分为chars列,包括空格和顺序。 (最大不得超过8个字符)
我需要为每个像这样的拆分创建一行数据
char(1) | Char(2) | char(3) | char(4) | char(5) | char(6) | char(7) | char(8)
row1: x y w 1 2
row2: j w w x
row3: m p p w
row4: a n p
row5: 2 3 4 5 6 7
答案 0 :(得分:1)
如果我理解正确,您只需要substring()
函数(在某些数据库中substr()
也可以使用):
select substring(col, 1, 1) as char_1,
substring(col, 2, 1) as char_2,
. . .
substring(col, 8, 1) as char_8
from t;
编辑:
以上假设字符串在单独的行中,这对我来说更有意义。假设逗号不是有效字符,请使用string_split()
(或您可以在网上轻松找到的相关功能):
select substring(str, 1, 1) as char_1,
substring(str, 2, 1) as char_2,
. . .
substring(str, 8, 1) as char_8
from t cross apply
string_split(t.data, ',') ss(str);
答案 1 :(得分:0)
另一个选择是使用少量XML和CROSS APPLY
示例
Declare @YourTable table (id int,SomeCol varchar(max))
Insert Into @YourTable values
(1,'xy w12,jwwx , mpp w,a n p ,234567')
Select A.ID
,char1 = substring(RetVal,1,1)
,char2 = substring(RetVal,2,1)
,char3 = substring(RetVal,3,1)
,char4 = substring(RetVal,4,1)
,char5 = substring(RetVal,5,1)
,char6 = substring(RetVal,6,1)
,char7 = substring(RetVal,7,1)
,char8 = substring(RetVal,8,1)
From @YourTable A
Cross Apply (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = B.i.value('(./text())[1]', 'varchar(max)')
From (Select x = Cast('<x>' + replace((Select replace(SomeCol,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B
返回
ID char1 char2 char3 char4 char5 char6 char7 char8
1 x y w 1 2
1 j w w x
1 m p p w
1 a n p
1 2 3 4 5 6 7