我有一列,DECIMAL(9,6)
即它支持999,123456之类的值。
但是当我插入数据123,4567时,它变成123,456700
如何删除这些零?
我有一列,DECIMAL(9,6)
即它支持999,123456之类的值。
但是当我插入数据123,4567时,它变成123,456700
如何删除这些零?
Answers:
Adecimal(9,6)
在逗号的右边存储6位数字。是否显示尾随零是格式决定,通常在客户端实施。
但是,由于SSMS格式float
不带尾随零,因此可以通过将强制零转换decimal
为a 来消除尾随零float
:
select
cast(123.4567 as DECIMAL(9,6))
, cast(cast(123.4567 as DECIMAL(9,6)) as float)
印刷品:
123.456700 123,4567
(我的小数点分隔符是逗号,但SSMS格式化带点的小数点。显然是已知问题。)
您可以使用该FORMAT()
函数(SqlAzure和Sql Server 2012+):
SELECT FORMAT(CAST(15.12 AS DECIMAL(9,6)), 'g18') -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10') -- '0.000158'
SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- '2'
与FLOAT(或REAL)一起使用时要小心:不要使用g17
或大于(或g8
与REAL一起使用)或更大,因为机器表示的精度有限会导致不良影响:
SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17') -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8') -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7') -- '0.9'
此外,请注意,根据文档:
FORMAT依赖于.NET Framework公共语言运行时(CLR)的存在。由于取决于CLR的存在,因此不会远程控制此功能。远程处理需要CLR的功能会在远程服务器上导致错误。
也可以在SqlAzure中使用。
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])
我不愿强制使用浮点数,因为在小数点中可能有比浮点数所能代表的位数更多的数字
FORMAT
当与标准.net格式字符串'g8'一起使用时,如果小数位数很小(例如1e-08),则返回科学计数法,这也不适合
使用自定义格式字符串(https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/custom-numeric-format-strings)使我能够实现想要的目标:
DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23
如果您希望数字至少有一个尾随零,那么2.0不会变成2,请使用格式字符串,例如 0.0#####
小数点是本地化的,因此使用逗号作为小数点分隔符的区域性会遇到逗号输出,其中。是
当然,这是让数据层进行格式化的不明智的做法(但在我的情况下,没有其他层;用户实际上是在运行存储过程并将结果放入电子邮件中:/)
SELECT REVERSE(ROUND(REVERSE(2.5500),1))
印刷品:
2.55
试试这个 :
SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")
给出20.55
0.000
成了.
。这是SELECT REPLACE(RTRIM(REPLACE(20.5500, "0", " ")), " ", "0")
仅修整尾随零点的方法
我有一个类似的问题,但是还需要删除不存在小数的小数点,这是我的解决方案,它将小数拆分为各个部分,并根据小数点字符串的长度将其从小数点字符串中提取的字符数作为基础分数成分(不使用CASE)。为了使事情变得更加有趣,我的数字被存储为一个没有小数的浮点数。
DECLARE @MyNum FLOAT
SET @MyNum = 700000
SELECT CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),2) AS VARCHAR(10))
+ SUBSTRING('.',1,LEN(REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')))
+ REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0')
我知道结果很痛苦,但在上述答案的帮助下,我到了那儿。
最好的方法是在转换之前不要转换为FLOAT或MONEY,因为这会失去精度。因此,安全方式可以是这样的:
CREATE FUNCTION [dbo].[fn_ConvertToString]
(
@value sql_variant
)
RETURNS varchar(max)
AS
BEGIN
declare @x varchar(max)
set @x= reverse(replace(ltrim(reverse(replace(convert(varchar(max) , @value),'0',' '))),' ',0))
--remove "unneeded "dot" if any
set @x = Replace(RTRIM(Replace(@x,'.',' ')),' ' ,'.')
return @x
END
其中@value可以是任何十进制(x,y)
sp_
用于存储过程,fn_
函数,tbl
表等。在...上,这不是必需的,但这是组织我们的数据库的最佳实践。
我有一个类似的问题,需要从数字中删除尾随零 xx0000,x00000,xxx000
我用了:
select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename
代码是带有要修剪的数字的字段名称。希望这对其他人有帮助。
我需要删除小数点后的零,以便我可以输出一定长度的字符串,并且仅以前导零
(例如,我需要输出14个字符,以便142.023400变为000000142.0234),
我使用parsename
,reverse
并cast
as int
删除了结尾的零:
SELECT
PARSENAME(2.5500,2)
+ '.'
+ REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))
(然后,为了得到我的前导零,我可以根据上面的长度复制正确数量的零,并将其连接到上面的前面)
我希望这对某人有帮助。
可以删除TSQL中的前导和尾随零
如果不是字符串,则使用STR TSQL函数将其转换为字符串,然后
删除前导零和尾随零
SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
有关论坛的更多信息。
REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(X,'0',' ')),' ','0'),'.',' ')),' ','.')
case when left(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end +
replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0') +
case when right(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0', ' '))), ' ', '0'), 1) = '.'
then '0'
else ''
end
我知道这是一篇旧文章,但想提供我提出的SQL
DECLARE @value DECIMAL(23,3)
set @value = 1.2000
select @value original_val,
SUBSTRING( CAST( @value as VARCHAR(100)),
0,
PATINDEX('%.%',CAST(@value as VARCHAR(100)))
)
+ CASE WHEN ROUND(
REVERSE( SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
)
,1) > 0 THEN
'.'
+ REVERSE(ROUND(REVERSE(SUBSTRING( CAST(@value as VARCHAR(100)),
PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
LEN(CAST(@value as VARCHAR(100)))
)
),1))
ELSE '' END AS modified_val
试试这个。
select CAST(123.456700 as float),cast(cast(123.4567 as DECIMAL(9,6)) as float)
试试这个:
select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100
我知道此线程非常旧,但是对于那些不使用SQL Server 2012或更高版本或者由于任何原因而无法使用FORMAT函数的线程,则以下工作。
同样,如果该数目小于1(例如0.01230000),则许多解决方案将不起作用。
请注意,以下内容不适用于负数。
DECLARE @num decimal(28,14) = 10.012345000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
set @num = 0.0123450000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0')
分别返回10.012345和0.012345。
试试这个:
select isnull(cast(floor(replace(rtrim(ltrim('999,999.0000')),',','')) as int),0)
999999
,OP要求删除尾随零。
DECIMAL(9,6)列将转换为float而不损失精度,因此CAST(... AS float)将解决问题。
@HLGEM:说浮点数是存储数字的不佳选择,“永远不要使用浮点数”是不正确的-您只需要知道数字,例如温度测量就可以很好地适应浮点数。
@abatishchev和@japongskie:如果不需要的话,在SQL存储的proc和函数前面的前缀仍然是一个好主意;您提到的链接仅指示不要对不应使用的存储过程使用“ sp_”前缀,其他前缀也可以,例如“ usp_”或“ spBob_”
参考:“所有有效位数不超过6个或更少的整数都可以转换为IEEE 754浮点值而不会损失精度”:https : //en.wikipedia.org/wiki/Single-precision_floating-point_format