在sql查询中两次修剪点后的第一个零

在sql查询中两次修剪点后的第一个零,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我正在尝试使用SQL Server比较程序集版本,但是返回的版本可能不止一个,我需要它是六位数的格式 例如,程序集版本2.00.0001,我需要将其作为2.0.1返回 可能有像1.01.0031这样的版本,我需要1.1.31 这是可行的,但是有更好的方法吗 select left(left([output],9),1)+'.'+substring(left([output],9),3,1)+'.'+substring(right(left([output],9),1),1,1) 对于有限数量的

我正在尝试使用SQL Server比较程序集版本,但是返回的版本可能不止一个,我需要它是六位数的格式

例如,程序集版本
2.00.0001
,我需要将其作为
2.0.1
返回

可能有像
1.01.0031
这样的版本,我需要
1.1.31

这是可行的,但是有更好的方法吗

select left(left([output],9),1)+'.'+substring(left([output],9),3,1)+'.'+substring(right(left([output],9),1),1,1)

对于有限数量的零,可以将
.0
替换为

select replace(replace(replace([output], '.00', '.'), '.0', '.'), '..', '.0.')

这是一个小技巧,但相对简单。

对于有限数量的零,您可以将
.0
替换为

select replace(replace(replace([output], '.00', '.'), '.0', '.'), '..', '.0.')

这是一个小技巧,但相对简单。

使用
ParseName
函数,您可以实现这一点。试试这个-

DECLARE @val VARCHAR(100) = '01.10.0031'

SELECT CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 3))) + '.' + 
     CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 2))) + '.' + 
     CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 1)))
结果

1.10.31

使用
ParseName
函数可以实现这一点。试试这个-

DECLARE @val VARCHAR(100) = '01.10.0031'

SELECT CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 3))) + '.' + 
     CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 2))) + '.' + 
     CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 1)))
结果

1.10.31

因为模式总是固定的,所以可以使用
substring
cast
来执行此操作

select substring(col,1,1) + '.'
       cast(cast(substring(col,3,2) as int) as varchar(2)) + '.'
       cast(cast(substring(col,6,4) as int) as varchar(4))
from tablename

因为模式总是固定的,所以可以使用
substring
cast
来执行此操作

select substring(col,1,1) + '.'
       cast(cast(substring(col,3,2) as int) as varchar(2)) + '.'
       cast(cast(substring(col,6,4) as int) as varchar(4))
from tablename

这里是一个动态解决方案,它可以使用任何格式,只要没有alpha,并且“.”是分隔符

Create  Function [dbo].[SplitString] ( @stringToSplit VARCHAR(MAX) )
RETURNS
 varchar(MAX)
AS
BEGIN

 DECLARE @name VARCHAR(MAX)
 DECLARE @pos INT
 Declare @Return Varchar(MAX) = ''

 WHILE CHARINDEX('.', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX('.', @stringToSplit)  
  SELECT @name = Convert(Varchar(MAX), Convert(Int, SUBSTRING(@stringToSplit, 1, @pos-1)))

  Set @Return = @Return + @name + '.'

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 RETURN @Return + Convert(Varchar(MAX), Convert(Int, @stringToSplit))
END


这里是一个动态解决方案,它可以使用任何格式,只要没有alpha,并且“.”是分隔符

Create  Function [dbo].[SplitString] ( @stringToSplit VARCHAR(MAX) )
RETURNS
 varchar(MAX)
AS
BEGIN

 DECLARE @name VARCHAR(MAX)
 DECLARE @pos INT
 Declare @Return Varchar(MAX) = ''

 WHILE CHARINDEX('.', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX('.', @stringToSplit)  
  SELECT @name = Convert(Varchar(MAX), Convert(Int, SUBSTRING(@stringToSplit, 1, @pos-1)))

  Set @Return = @Return + @name + '.'

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 RETURN @Return + Convert(Varchar(MAX), Convert(Int, @stringToSplit))
END


我相信只要模式包含两个小数点,并且在每个位置处理任意数量的零,这种方法就应该有效

DECLARE @version VARCHAR(19)
SET @version = '2.00.0001'

SELECT 
  CAST(CAST(SUBSTRING(@version,1,CHARINDEX('.',@version,1)-1) AS INT) AS VARCHAR(5)) + '.'+
  CAST(CAST(SUBSTRING(@version,CHARINDEX('.',@version,1)+1,CHARINDEX('.',@version,CHARINDEX('.',@version,1) + 1)-CHARINDEX('.',@version,1)-1)  AS INT) AS VARCHAR(5)) + '.' +
  CAST(CAST(SUBSTRING(@version,CHARINDEX('.',@version,CHARINDEX('.',@version,1) + 1)+1,LEN(@version)) AS INT) AS VARCHAR(5))

我相信只要模式包含两个小数点,并且在每个位置处理任意数量的零,这种方法就应该有效

DECLARE @version VARCHAR(19)
SET @version = '2.00.0001'

SELECT 
  CAST(CAST(SUBSTRING(@version,1,CHARINDEX('.',@version,1)-1) AS INT) AS VARCHAR(5)) + '.'+
  CAST(CAST(SUBSTRING(@version,CHARINDEX('.',@version,1)+1,CHARINDEX('.',@version,CHARINDEX('.',@version,1) + 1)-CHARINDEX('.',@version,1)-1)  AS INT) AS VARCHAR(5)) + '.' +
  CAST(CAST(SUBSTRING(@version,CHARINDEX('.',@version,CHARINDEX('.',@version,1) + 1)+1,LEN(@version)) AS INT) AS VARCHAR(5))

图案是否总是用2
s固定?是的,它总是1个数字,点,2个数字,点,4个数字。图案是否总是用2
s固定?是的,它总是1个数字,点,2个数字,点,4个数字。这是行不通的。如果该值为01.10.0031,会发生什么情况?如果用空字符串替换“0”的每个实例,则会阻止任何可被10整除的值。@SeanLange:您是对的。我修改了我的答案。顺便说一句,谢谢你的指点。这是行不通的。如果该值为01.10.0031,会发生什么情况?如果用空字符串替换“0”的每个实例,则会阻止任何可被10整除的值。@SeanLange:您是对的。我修改了我的答案。顺便说一句,感谢您指出。从性能的角度来看,当字符串拆分器运行时,while循环是最糟糕的方法。从性能的角度来看,当字符串拆分器运行时,while循环是最糟糕的方法。