我有一个varchar列,其版本信息的格式如下:1.xyz其中x,y,z可以是任意长度。如果z大于2,我需要将z的长度限制为只有两个。
例如:1.345.23.5dfgdfg
应为1.345.23.5d
而1.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)
答案 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()
进行分割和添加?
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 =服务器名称