小数点后的LEN为1时加0

时间:2014-01-29 13:36:54

标签: sql sql-server tsql

我在数据库中有一些像varchar这样的数据

当小数点后的字符数为1时,我想添加0

4.2
4.80
2.43
2.45

变为

4.20
4.80
2.43
2.45

有什么想法吗?我目前正在尝试使用LEFT和LEN,但无法使其工作

3 个答案:

答案 0 :(得分:3)

如果需要,您可以将varchars转换为小数,但它可能不安全,因为您不知道它是否始终有效:

CONVERT(decimal(10,2), MyColumn)

那种事。

应该注意的是,如果您的varchars说4.103,精度值(在上面的示例中,'2')将关闭值。

此外,我注意到如果您使用的是SQL Server 2012,那么现在有'TRY_CONVERT'和'TRY_CAST'会更安全:

http://msdn.microsoft.com/en-us/library/hh230993.aspx

答案 1 :(得分:2)

您可以将其转换为适当的数据类型吗? (或者更好的是,store it as the appropriate data type):

SELECT  v,
        AsDecimal = CAST(v AS DECIMAL(3, 2))
FROM    (VALUES ('4.2'), ('4.80'), ('2.43'), ('2.45')) t (v)

会给:

v       AsDecimal
4.2     4.20
4.80    4.80
2.43    2.43
2.45    2.45

如果这不是一个选项,您可以使用:

SELECT  v,
        AsDecimal = CAST(v AS DECIMAL(4, 2)),
        AsVarchar = CASE WHEN CHARINDEX('.', v) = 0 THEN v + '.00'
                        WHEN CHARINDEX('.', REVERSE(v)) > 3 THEN SUBSTRING(v, 1, CHARINDEX('.', v) + 2)
                        ELSE v + REPLICATE('0', 3 - CHARINDEX('.', REVERSE(v)))
                    END
FROM    (VALUES ('4.2'), ('4.80'), ('2.43'), ('2.45'), ('54'), ('4.001'), ('35.051')) t (v);

给出了:

v       AsDecimal   AsVarchar
4.2     4.20        4.20
4.80    4.80        4.80
2.43    2.43        2.43
2.45    2.45        2.45
54      54.00       54.00
4.001   4.00        4.00
35.051  35.05       35.05

最后,如果您有非varchar值,则需要首先使用ISNUMERIC检查转换,但this has its flaws

SELECT  v,
        AsDecimal = CASE WHEN ISNUMERIC(v) = 1 THEN CAST(v AS DECIMAL(4, 2)) END,
        AsVarchar = CASE WHEN ISNUMERIC(v) = 0 THEN v
                        WHEN CHARINDEX('.', v) = 0 THEN v + '.00'
                        WHEN CHARINDEX('.', REVERSE(v)) > 3 THEN SUBSTRING(v, 1, CHARINDEX('.', v) + 2)
                        ELSE v + REPLICATE('0', 3 - CHARINDEX('.', REVERSE(v)))
                    END,
        SQLServer2012 = TRY_CONVERT(DECIMAL(4, 2), v)
FROM    (VALUES ('4.2'), ('4.80'), ('2.43'), ('2.45'), ('54'), ('4.001'), ('35.051'), ('fail')) t (v);

给出了:

v       AsDecimal   AsVarchar   SQLServer2012
4.2     4.20        4.20        4.20
4.80    4.80        4.80        4.80
2.43    2.43        2.43        2.43
2.45    2.45        2.45        2.45
54      54.00       54.00       54.00
4.001   4.00        4.00        4.00
35.051  35.05       35.05       35.05
fail    NULL        fail        NULL

答案 2 :(得分:1)

CREATE TABLE [dbo].[test10](
[number] [nvarchar](10) NULL
) 

- 插入值。

只是@dougajmcdonald

对上述答案的补充
select convert(decimal(10,2),number) as Added0 from test10 where ISNUMERIC(number) <> 0
相关问题