SQL 服务器:删除小数点后的尾随 0。 nvarchar 数据类型
SQL Server : remove trailing 0's after decimal point. nvarchar datatype
我正在编写一个 SQL 查询,从两个单独的 table 中返回总工资。两个 table 中的金额都是 nvarchar
数据类型。在一个 table 中,我有“150.0000”,在另一个中,我有“150”,有什么方法可以删除尾随的 0 吗?这是我的代码
SELECT DISTINCT
s.EEid,
s.Gross AS 'S Gross',
pr.EEid,
pr.Gross AS 'PR Gross'
FROM
starPayHistory s
INNER JOIN
payRunPayHistory pr ON pr.EEid = s.EEid
ORDER BY
s.EEid
查询结果
我已经尝试将这行代码设为 trim 前导 0,但 returns '15'。它删除所有 0。
这是代码
REPLACE(ltrim(REPLACE(s.Gross,'0','')), ' ', '0') AS 'S Gross'
这行代码的结果
任何帮助将不胜感激!
试试这个:
CAST(CAST(s.Gross As FLOAT) AS NVARCHAR(32))
但是,如果您可以控制 table 请注意,关于您的问题的几条评论都说最好存储为数字。并不是说这利用了使其成为数字的优势。因此,如果可以,请考虑更改 table 上的类型,我同意其他人的意见,问题就消失了。
DECLARE @x as varchar(32) = '653710000.01';
--note rounding error occurs
select CAST(CAST(@x As FLOAT) AS NVARCHAR(32));
--how to break this one?
select
CASE WHEN PATINDEX('%[.]%',REVERSE(@x)) = PATINDEX('%[123456789.]%',REVERSE(@x))
THEN
LEFT(@x, LEN(@X) - PATINDEX('%[.]%',REVERSE(@x)))
ELSE
CASE WHEN PATINDEX('%[.]%',REVERSE(@x)) > 0
THEN
LEFT(@x, 1 + LEN(@X) - PATINDEX('%[123456789.]%',REVERSE(@x)))
ELSE
@X
END
END ;
我不建议转换为 float
,因为这可能会产生意想不到的后果,因为 float
不是一个精确的表示。您可以只使用字符串操作。例如:
select (case when s.gross like '%.%'
then replace(rtrim(replace(s.gross, '0', ' ')), ' ', '0')
else s.gross
end)
例如,尝试 运行 this db<>fiddle。
我正在编写一个 SQL 查询,从两个单独的 table 中返回总工资。两个 table 中的金额都是 nvarchar
数据类型。在一个 table 中,我有“150.0000”,在另一个中,我有“150”,有什么方法可以删除尾随的 0 吗?这是我的代码
SELECT DISTINCT
s.EEid,
s.Gross AS 'S Gross',
pr.EEid,
pr.Gross AS 'PR Gross'
FROM
starPayHistory s
INNER JOIN
payRunPayHistory pr ON pr.EEid = s.EEid
ORDER BY
s.EEid
查询结果
我已经尝试将这行代码设为 trim 前导 0,但 returns '15'。它删除所有 0。
这是代码
REPLACE(ltrim(REPLACE(s.Gross,'0','')), ' ', '0') AS 'S Gross'
这行代码的结果
任何帮助将不胜感激!
试试这个:
CAST(CAST(s.Gross As FLOAT) AS NVARCHAR(32))
但是,如果您可以控制 table 请注意,关于您的问题的几条评论都说最好存储为数字。并不是说这利用了使其成为数字的优势。因此,如果可以,请考虑更改 table 上的类型,我同意其他人的意见,问题就消失了。
DECLARE @x as varchar(32) = '653710000.01';
--note rounding error occurs
select CAST(CAST(@x As FLOAT) AS NVARCHAR(32));
--how to break this one?
select
CASE WHEN PATINDEX('%[.]%',REVERSE(@x)) = PATINDEX('%[123456789.]%',REVERSE(@x))
THEN
LEFT(@x, LEN(@X) - PATINDEX('%[.]%',REVERSE(@x)))
ELSE
CASE WHEN PATINDEX('%[.]%',REVERSE(@x)) > 0
THEN
LEFT(@x, 1 + LEN(@X) - PATINDEX('%[123456789.]%',REVERSE(@x)))
ELSE
@X
END
END ;
我不建议转换为 float
,因为这可能会产生意想不到的后果,因为 float
不是一个精确的表示。您可以只使用字符串操作。例如:
select (case when s.gross like '%.%'
then replace(rtrim(replace(s.gross, '0', ' ')), ' ', '0')
else s.gross
end)
例如,尝试 运行 this db<>fiddle。