SQL在char处拆分字符串,然后将每个拆分成单独的char()作为视图,或者只需选择

时间:2018-10-06 15:57:20

标签: sql sql-server string split

我有一列看起来像这样的数据:

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  

2 个答案:

答案 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