Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 小数点后的LEN为1加0的情况_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 小数点后的LEN为1加0的情况

Sql 小数点后的LEN为1加0的情况,sql,sql-server,tsql,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,但无法使其工作如果需要,您可以将varchar转换为小数,但这可能不安全,因为您不知道它是否始终有效: CONVERT(decimal(10,2), MyColumn) 那种事 应该注意的是,如果您的VARCHAR为4.103,则精度值(在上面的示例中为“2”)将修剪值

我在数据库中有一些类似于varchar的数据

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

4.2
4.80
2.43
2.45
变成

4.20
4.80
2.43
2.45

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

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

CONVERT(decimal(10,2), MyColumn)
那种事

应该注意的是,如果您的VARCHAR为4.103,则精度值(在上面的示例中为“2”)将修剪值

此外,我注意到,如果您使用的是SQL Server 2012,那么现在有“TRY\u CONVERT”和“TRY\u CAST”两种更安全的方法:


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

CONVERT(decimal(10,2), MyColumn)
那种事

应该注意的是,如果您的VARCHAR为4.103,则精度值(在上面的示例中为“2”)将修剪值

此外,我注意到,如果您使用的是SQL Server 2012,那么现在有“TRY\u CONVERT”和“TRY\u CAST”两种更安全的方法:

--插入值

只是@dougajmcdonald对上述答案的补充

select convert(decimal(10,2),number) as Added0 from test10 where ISNUMERIC(number) <> 0
从test10中选择convert(十进制(10,2),number)作为Added0,其中ISNUMERIC(number)0
--插入值

只是@dougajmcdonald对上述答案的补充

select convert(decimal(10,2),number) as Added0 from test10 where ISNUMERIC(number) <> 0
从test10中选择convert(十进制(10,2),number)作为Added0,其中ISNUMERIC(number)0

您可以将其强制转换为适当的数据类型吗?(或者更好的是,):

将提供:

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
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
最后,如果您有非varchar值,则需要首先使用ISNUMERIC检查转换,但是:

其中:

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
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

您可以将其强制转换为适当的数据类型吗?(或者更好的是,):

将提供:

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
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
最后,如果您有非varchar值,则需要首先使用ISNUMERIC检查转换,但是:

其中:

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
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

感谢您的回复,我尝试过这样做,但在将varchar转换为数值时,它只是说
错误
我已经使用ISNUMERIC进行了检查,并且所有的值都是数值:/任何想法?如果这是查询的结果,那么您确实有一些SQL无法转换的内容。看看这里的一些选项,了解如何防范这种情况:你能发布你的整个查询来看看吗?谢谢你的回复,我尝试过这样做,但在将varchar转换为数值时,它只是说
错误
我已经使用ISNUMERIC进行了检查,并且所有的值都是数值:/任何想法?如果这是查询的结果,那么您确实有一些SQL无法转换的内容。看看这里的一些选项,了解如何防范这种情况:你能发布你的整个查询来看看吗?这太棒了,非常感谢!在插入之前,我运行验证来检查它是否是数字的,所以希望它们都是有效的。这太神奇了,非常感谢!在插入之前,我运行验证来检查它是否是数字的,所以希望它们都是有效的