SQL Server - 拆分字符串

时间:2018-02-16 12:48:38

标签: sql sql-server

我在以下名为dbo.faresnumb的表中有一个名为Column1的下一个字符串

Column1
512.65USD/52.65USD/0167025354825

我想从这个字符串创建三个新列,名为Fare1,Fare2,Number1,如下所示

Fare1      Fare2      Number1
512.65USD  52.65USD   0167025354825

所以分隔符是/,字符数不总是完全相同。例如,Fare1可能是54.00USD而不是512.65USD,我仍需要在第一个/之前捕获所有内容。我知道SAS有一种方法可以扫描子字符串以找到分隔符并分配新的变量,但我是SQL的新手。任何帮助将不胜感激!

谢谢, 贝内特

2 个答案:

答案 0 :(得分:2)

这样的字符串操作在SQL Server中很痛苦。你可以这样做:

select parts.part1 as fare1,
       left(rest, charindex('/', rest) - 1) as fare2,
       stuff(rest, 1, charindex('/', rest), '') as number1
from t cross apply
     (values (left(col, charindex('/', col) - 1),
              stuff(col, 1, charindex('/', col), '')
             )
     ) parts(part1, rest);

这是rextester

可悲的是,SQL Server 2016提供了split_string(),这使得这更简单。可悲的是,它不会返回字符串中子字符串的位置。这需要确保三个提取的值的顺序正确。

答案 1 :(得分:1)

使用一点XML -

来实现相同的另一种方法
select cast(concat('<x>', REPLACE(Column1, '/', '</x><x>'), '</x>') as xml).value('/x[1]','varchar(100)'), 
       cast(concat('<x>', REPLACE(Column1, '/', '</x><x>'), '</x>') as xml).value('/x[2]','varchar(100)'),
       cast(concat('<x>', REPLACE(Column1, '/', '</x><x>'), '</x>') as xml).value('/x[3]','varchar(100)') from dbo.faresnumb