我在以下名为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的新手。任何帮助将不胜感激!
谢谢, 贝内特
答案 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