【问题标题】:SQL Round if numerical?SQL Round 如果数字?
【发布时间】:2018-05-07 14:25:02
【问题描述】:

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

【问题讨论】:

  • IsNumeric 在这里并不安全。它返回很多误报。而且您必须将舍入值转换为 varchar,因为您不能在单个列中混合数据类型。
  • 投射到float 的目标是什么?您的列数据类型不能同时为 floatnvarchar,因此即使在您的情况下将两者分开,它也会在 ELSE 上失败。

标签: sql sql-server


【解决方案1】:

我会选择try_convert() 而不是isnumeric()

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

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

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

【讨论】:

  • 这是特定的 sqlserver 版本吗?我在 sql server 2014 中得到'DECIMAL' is not a recognized built-in function name
  • 我也在使用 14,正在玩弄你的合并,但似乎无法通过此语句获得正确的语法
  • 'DECIMAL' 不是可识别的内置函数名称。这是服务器 2017 功能吗? - 感谢语法更新 aaron
  • 嗯..我一定忽略了一些东西,我可以复制粘贴它并且它有效。以前,括号有点偏离,所以它是作为函数读取小数部分。这不是一个函数,它是TRY_CONVERT 的一部分。 TRY_CONVERT 是 2012+ 我相信..
  • @dan6657 你可能不在 2014 年?这是一个示例:rextester.com/LJUY58009
【解决方案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;

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

【讨论】:

  • 感谢您的帮助,我仍然遇到这种情况下的演员错误:[
  • 复制/粘贴整个查询并运行它。它仍然给出错误吗?它可以在我的数据库上正常工作。
  • 这确实有效,我会再次查看我的查询。
  • 或者您的表中可能有其他数据而不是您的样本中可能导致这种情况的数据
  • 是的,我现在用这个值得到它,让我处理这个
猜你喜欢
  • 2010-11-07
  • 2012-07-03
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多