我在数据库中有一些像varchar这样的数据
当小数点后的字符数为1时,我想添加0
4.2
4.80
2.43
2.45
变为
4.20
4.80
2.43
2.45
有什么想法吗?我目前正在尝试使用LEFT和LEN,但无法使其工作
答案 0 :(得分:3)
如果需要,您可以将varchars转换为小数,但它可能不安全,因为您不知道它是否始终有效:
CONVERT(decimal(10,2), MyColumn)
那种事。
应该注意的是,如果您的varchars说4.103,精度值(在上面的示例中,'2')将关闭值。
此外,我注意到如果您使用的是SQL Server 2012,那么现在有'TRY_CONVERT'和'TRY_CAST'会更安全:
答案 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