SQL Parse String,必须是更好的方法

时间:2016-06-24 13:49:10

标签: sql sql-server string

我有一个有点时髦的字符串,除了使用数字位置和一串子字符串之外,我似乎无法找到更好的解析方法。

有没有更好的方法来打破这个字符串?

Declare @EXTERNAL_KEY Varchar(100) = 'ABC_2015SP_DEFG1321.088TR'

Print Substring(@EXTERNAL_KEY,CHARINDEX('_',@EXTERNAL_KEY)+8,4)+' '+Replace(Substring(@EXTERNAL_KEY,CHARINDEX('_',@EXTERNAL_KEY)+12,8),'.',' ')+' '+Substring(@EXTERNAL_KEY,CHARINDEX('_',@EXTERNAL_KEY)+20,2)

我希望实现的最终结果:

DEFG 1321 088 TR

3 个答案:

答案 0 :(得分:3)

您可以使用STUFF + PARSENAME + REPLACE

SELECT  STUFF(PARSENAME(REPLACE(@EXTERNAL_KEY,'_','.'),2),5,0,' ') +' '+ STUFF(PARSENAME(@EXTERNAL_KEY,1),4,0,' ')

输出:

DEFG 1321 088 TR

答案 1 :(得分:2)

采用固定格式

Declare @EXTERNAL_KEY Varchar(100) = 'ABC_2015SP_DEFG1321.088TR';
select  stuff(stuff(replace(right(@EXTERNAL_KEY,14), '.', ' ') ,13,0,' '), 5,0,' ')

答案 2 :(得分:1)

如果您的格式已修复,请尝试使用'PARSENAME' AND 'LEFT''RIGHT'功能以避免静态索引

DECLARE @Str NVARCHAR(MAX)='ABC_2015SP_DEFG1321.088TR'
SELECT   LEFT(PARSENAME(REPLACE(@Str,'_','.'),2),4)+' '+RIGHT(PARSENAME(REPLACE(@Str,'_','.'),2),4)+' '+LEFT(PARSENAME(REPLACE(@Str,'_','.'),1),3)+' '+RIGHT(PARSENAME(REPLACE(@Str,'_','.'),1),2)