获取最终特殊字符左侧的所有字符+最终特殊字符SQL Server后的2个字符

时间:2017-11-01 18:47:44

标签: sql sql-server

我有一个varchar列,其版本信息的格式如下:1.xyz其中x,y,z可以是任意长度。如果z大于2,我需要将z的长度限制为只有两个。

例如:1.345.23.5dfgdfg应为1.345.23.5d1.345.23.5应为1.345.23.5

我有以下的sql给了我所需的版本,但是有更简单的方法来实现这个吗?

declare @s varchar(50)
set @s = '1.345.23.5dfgdfg'
select  left(@s,len(@s) - (charindex('.',reverse(@s))-1)) + substring(right(@s,charindex('.',reverse(@s))-1),0,3)

3 个答案:

答案 0 :(得分:1)

如果你知道字符串总是有这种格式,我倾向于使用:

select (case when charindex('.', reverse(@s)) < 3 then @s
             else left(@s, len(@s) - charindex('.', reverse(@s)) + 3)
        end)

这与你的陈述非常相似,所以你可能认为它不简单。

答案 1 :(得分:1)

凝聚了一些逻辑:

select left(@s,len(@s)+(3-charindex('.',reverse(@s))))

使用@s的不同值进行测试:

create table t (s varchar(50))
insert into t values 
 ('1.345.23.5dfgdfg')
,('1.345.23.5d')
,('1.345.23.3')

select s, left(s,len(s)+(3-charindex('.',reverse(s))))
from t

rextester演示:http://rextester.com/USIW73651

返回:

+------------------+------------------+
|        s         | (No column name) |
+------------------+------------------+
| 1.345.23.5dfgdfg | 1.345.23.5d      |
| 1.345.23.5d      | 1.345.23.5d      |
| 1.345.23.5       | 1.345.23.5       |
+------------------+------------------+

答案 2 :(得分:0)

使用Parsename()进行分割和添加?

Demo

declare @s varchar(50)
set @s = '1.345.23.5dfgdfg'

Select PARSENAME ( @s , 4 ) +'.'+
       PARSENAME ( @s , 3 ) +'.'+
       PARSENAME ( @s , 2 ) +'.'+
       left(PARSENAME ( @s , 1 ),2)

通常用于引用IP地址或更具体地用于其预期用途:完全限定的对象

1 =对象名称 2 =架构名称 3 =数据库名称 4 =服务器名称