在sql查询中两次修剪点后的第一个零
我正在尝试使用SQL Server比较程序集版本,但是返回的版本可能不止一个,我需要它是六位数的格式 例如,程序集版本在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) 对于有限数量的
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循环是最糟糕的方法。