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

时间:2016-05-17 19:38:37

标签: 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)

5 个答案:

答案 0 :(得分:5)

使用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

答案 1 :(得分:2)

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

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

这有点像黑客,但它相对简单。

答案 2 :(得分:1)

由于该模式始终是固定的,因此您可以使用substringcast来执行此操作。

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

答案 3 :(得分:0)

这是一个动态解决方案,可以使用任何格式,前提是没有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 @ver Varchar(100) = '7.00.0001'

Select dbo.splitstring(@ver)

答案 4 :(得分:0)

我认为只要模式包含两个小数点并且每个位置都应该处理任意数量的零,这应该有效

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))