从字符串中间拉出可变长度子字符串

时间:2016-03-20 04:15:48

标签: tsql

我试图从主字符串中获取可变长度的字符串。 例如:

ABC*12*1*name name****XX*123456789~
ABC*12*1*diffname diffname****XX*234567890~
ABC*12*1*diffname2 diffname2***XX*345678901~

我需要提取名称',' diffname diffname',' diffname2 diffname2'

来自字符串的

等。然后更换' '带星号的名字之间 - 但是,我不能只插入字符串的第一个空格,可能有多个名字,所以我想插入' *'进入第二个或第三个空格,具体取决于名称字符串的长度。

SELECT 
        CHARINDEX('*1*',data)+3 AS startpos,
        CHARINDEX('***',data) AS Endpos,
        data
from #t
where data like '%ABC*12*1*%'

这为我提供了可变长度字符串的起点和终点。所以我试试:

SELECT SUBSTRING(data,CHARINDEX('*1*',data)+3,CHARINDEX('***',data) -CHARINDEX('*1*',data)+3)
FROM #t
WHERE data like '%ABC*12*1*name%'

但是这给了我

name n name aa*****X

作为结果集,基本上从起点开始,然后在终点之后运行。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

这部分是问题所在:

SELECT .....-CHARINDEX('*1*',data)+3
FROM   .....
WHERE  .....

你想用Endpos减去所以它应该用括号写成:

-(CHARINDEX('*1*',data)+3)

如果删除括号,则最后一部分应变为-3

-CHARINDEX('*1*',data)-3