SQL Round如果数字?

时间:2018-05-07 14:25:02

标签: sql sql-server

(初学者在sql)

我一直在收到错误

'Error converting data type nvarchar to float.'

这是因为我试图用字符和整数对nvarchar(10)列进行舍入,显然它不能对字符进行舍入。 (我不能使用不同的数据类型创建两个单独的列,因为它们都需要在此列中)

我正在寻找一种方法来舍入nvarchar列中的数字,同时还返回字符

我正在尝试CAST / Converts似乎无法正常工作

我也试过

CASE WHEN ISNUMERIC(Tbl1.Column1) = 1
THEN    cast(Round(Tbl1.Column1, 0) AS float)
ELSE Tbl1.Column1 END   AS 'Column1'
选择语句中的

我无法弄清楚还有什么可以解决这个问题!

此列中的示例数据为

 8.1
 2
 9.0
 9.6
 A
 -
 5.3
 D
 E
 5.1
 -

2 个答案:

答案 0 :(得分:3)

我会选择try_convert()代替isnumeric()

COALESCE(CONVERT(VARCHAR(255), TRY_CONVERT(DECIMAL(10, 0), Tbl1.Column1)),Tbl1.Column1) as Column1

您的方法会出现转换问题,因为case表达式返回单个值。其中一个分支是数字,因此返回类型为数字 - else中的转换失败。

您可以在转换为浮点数后将then子句转换为字符串来修复您的版本。

答案 1 :(得分:2)

由于您在此列中保留了这两种类型,因此需要将舍入值转换回varchar

declare @Tbl1 table (Column1 varchar(10))

insert into @Tbl1 (Column1) values ('8.1'), ('2'), ('9.0'), 
                                   ('9.6'), ('A'), ('5.3'), 
                                   ('D'), ('E'), ('5.1'), ('-')

select case when TRY_CONVERT(float, Column1) IS NULL then Column1
            else cast(cast(Round(Column1, 0) as float) as varchar(10))
       end  AS 'Column1' 
from   @Tbl1      

结果是

Column1
-------
8
2   
9
10  
A   
5   
D   
E   
5   
-

如果您收到错误TRY_CONVERT不是内置函数,那么您的数据库兼容级别低于SQL 2012。

您可以使用此命令更正

ALTER DATABASE your_database SET COMPATIBILITY_LEVEL = 120;

另请注意,在此声明之后,Gordon的答案现在正在发挥作用,我同意这是一个比我更好的答案