【问题标题】:SQL Bigint*DecimalSQL Bigint*十进制
【发布时间】:2016-03-21 21:02:40
【问题描述】:

这可能看起来很简单,但我想不通。我有一个数据类型为 bigint 的字段,我试图将它乘以另一个十进制(9,5)字段,但我在所有计算中都得到了 null。我尝试将 Bigint 转换为十进制,但它也不起作用。我错过了什么?

我相信我正在使用 SQL Server 2000。我引用了两个不同表中的数字,这些表连接在一个公共字段上。

((cast([costs] as decimal(9,5)) * cast([Ratio] as decimal(9,5))) as [Cost Ratio]

我还添加了 isnull(ratio,0),现在它使用 0.00000 填充我的空值,但仍然没有在 [cost ratio] 字段中获得相乘值。

【问题讨论】:

标签: sql sql-server decimal bigint


【解决方案1】:

您应该得到算术异常,而不是空值。您正在将 BigInt 值转换为 decimal(9,5),其精度 = 9 比例 = 5,小数点左侧只剩下 4 位数字。 BigInt 列中的所有值至少为 6 位或更大。这意味着decimal(9,5) 中没有足够的空间来存储这么大的 int 值。试试decimal(18,5),它会在小数点左侧为查询中的类型留出足够的空间。

也不要忘记 ISNULL(数据中的值可以为 null)并期望如果它为 null,那么您将得到 0 的结果。

((cast([ISNULL(costs,0)] as decimal(18,5)) * cast([ISNULL(Ratio,0)] as decimal(18,5))) as [Cost Ratio]

此外,如果您的 Ratio 列类型已经是 decimal(9,5),则不要再次转换它,请添加 ISNULL 检查它是否为可空列。

有关 sql server 十进制类型的更多详细信息,请参阅:Sql Server Decimals。我选择 18 作为精度的原因与存储有关。

【讨论】:

  • 所以我尝试了一些改变,现在我在结果列中得到了所有 0.000000000。这是否意味着 SQL 认为我的某个字段为空?
  • 嗯,0 * any value 始终为 0,但任何值为 NULL 的除外。
  • 如果您不确定它是哪一列,然后通过拆分它们来更改选择以找出答案。 ((cast([ISNULL(costs,0)] as decimal(18,5)) AS LeftSide, cast([ISNULL(Ratio,0)] as decimal(18,5))) AS RightSide
  • 我将强制转换为 ((cast([ISNULL(costs,0)] as decimal(18,5)) * cast([ISNULL(Ratio,1)] as decimal(18,5 ))) 作为 [成本比率] 并且我所有的结果都填充了“1”。但我可以在表格中看到我的比率是小数(9,5)
  • 感谢@Igor,由于 isnull() 再次检查了字段,发现我更新了错误的数据字段。现在使用正确的,它正在使用小数(18,5)
猜你喜欢
  • 2020-09-27
  • 2021-09-27
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多