带有可变最后一个字符SQL Server的子字符串

时间:2018-05-24 13:23:34

标签: sql sql-server

我在数据库列中有许多行,看起来像这样

AB01-52
AB01-52/1
AB01-53/2
AB01-54

我可以得到字符串中没有斜杠的52但是当我尝试在短划线和斜线之间得到它时我得到一个错误或者获得52/1例如

我尝试过使用substring和charindex的大多数研究解决方案,但无济于事

有没有人见过这方面的解决方案。

提前致谢

瑞克

4 个答案:

答案 0 :(得分:1)

您可以减去字符位置(即/)并将其用作substring()的长度

substring(col, charindex('-', col)+1, len(col)-charindex('/', col)+1)

如果数字的长度可变,则从两个字符中减去并使用 length

substring(col, charindex('-', col)+1, charindex('/', col+'/')-charindex('-', col)-1)

答案 1 :(得分:0)

这是一种方法......

with cte as(
select 'AB01-53/2' as C1
union
select 'AB01-54')

select left(right(c1,len(c1) - charindex('-',c1)),len(right(c1,len(c1) - charindex('-',c1))) - charindex('/',right(c1,len(c1) - charindex('-',c1)))+ 1)
from cte

答案 2 :(得分:0)

如果该字段始终 AAAA-BB [/ CCC],则只需:

  SUNSTRING('AB01-52/1',6,2) ;

当然,'AB01-52/1'可以用变量或列名替换。

答案 3 :(得分:0)

我可能已找到答案但涉及两个阶段的过程

首先在包含当前没有斜线的数据的列中添加一个额外的斜杠,即AB01-52变为AB01-52 /其他像AB01-1023 / 01保持不变

第2阶段使用此代码:

substring(right(col1,len(col1)-charindex('-',col1)),0,charindex('/',right(col1,len(col1)-charindex('-',col1))))

这允许我获得中间字符串。各种贡献的人使用左派和右派有助于实现这一点 - 但是我仍然应该在没有第1阶段的情况下得到答案

感谢大家提出我的想法