(初学者在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
-
答案 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的答案现在正在发挥作用,我同意这是一个比我更好的答案