SQL在char处拆分字符串,然后将每个字符串拆分为单独的chars(),作为视图或仅选择
我有一列数据,如下所示:SQL在char处拆分字符串,然后将每个字符串拆分为单独的chars(),作为视图或仅选择,sql,sql-server,string,split,Sql,Sql Server,String,Split,我有一列数据,如下所示: xy w12,jwwx , mpp w,a n p ,234567 请注意,项目是csv,很容易分离;然而,我有一些其他的要求,使这更加困难 我需要拆分的字符串(包括从逗号到逗号的任何空格)成行 当然,最后一个要求是,这些字符串中的每一个都要按顺序拆分为包含空格的字符列。(最大值不得超过8个字符) 我需要为每个拆分创建一行数据,如下所示 char(1) | Char(2) | char(3) | char(4) | char(5) | ch
xy w12,jwwx , mpp w,a n p ,234567
请注意,项目是csv,很容易分离;然而,我有一些其他的要求,使这更加困难
我需要拆分的字符串(包括从逗号到逗号的任何空格)成行
当然,最后一个要求是,这些字符串中的每一个都要按顺序拆分为包含空格的字符列。(最大值不得超过8个字符)
我需要为每个拆分创建一行数据,如下所示
char(1) | Char(2) | char(3) | char(4) | char(5) | char(6) | char(7) | char(8)
如果我理解正确,您只需要
substring()
函数(在某些数据库中也可以使用substr()
):
编辑:
上面假设字符串在单独的行中,这对我来说更有意义。假设逗号不是有效字符,请使用string\u split()
(或您可以在web上找到的相关函数):
只是另一个使用少量XML和交叉应用的选项 示例
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
您使用的是什么数据库?@GordonLinoff MS-SQL Server OK所以我将字符串拆分为列,然后在每个列上添加子字符串?如果字符串没有8个字符,我会得到一个错误吗??
select substring(col, 1, 1) as char_1,
substring(col, 2, 1) as char_2,
. . .
substring(col, 8, 1) as char_8
from t;
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);
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