SQL Server:删除小数点后的尾随0。 nvarchar数据类型

时间:2018-12-11 16:58:07

标签: sql sql-server leading-zero

我正在编写一个SQL查询,从两个单独的表返回总工资。两个表中的数量均为nvarchar数据类型。在一个表中我有“ 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

查询结果

Results from query above

我已经尝试了这行代码来修剪前导0,但是它返回“ 15”。它删除所有0。

这是代码

REPLACE(ltrim(REPLACE(s.Gross,'0','')), ' ', '0') AS 'S Gross'

这行代码的结果

Results from REPLACE

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

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  ;

答案 1 :(得分:0)

尝试一下:

CAST(CAST(s.Gross As FLOAT) AS NVARCHAR(32))

但是,如果您可以控制表格,请注意,关于您的问题的几点评论都说,最好将其存储为数字。但这并不是利用使其数字化的优势。因此,如果可以的话,请考虑更改表的类型,而我也同意其他人的观点,问题就消失了。

答案 2 :(得分:0)

我不建议转换为float,因为这可能会带来意想不到的后果,因为float不是精确的表示形式。您可以只使用字符串操作。例如:

select (case when s.gross like '%.%'
             then replace(rtrim(replace(s.gross, '0', ' ')), ' ', '0')
             else s.gross
        end)

例如,尝试运行this db<>fiddle