【问题标题】:Varchar to Decimal conversion in DB2 with empty and null valuesDB2 中的 Varchar 到 Decimal 转换,具有空值和 null 值
【发布时间】:2014-08-11 15:51:05
【问题描述】:

我在 DB2 中有一个 varchar 字段 AMOUNT

可能的表状态值:

ID            AMOUNT
-------------------------
1             123.4578
2              NULL
2             123.78
1            -8562.85441
2            
1             0.0
-------------------------

AMOUNT 列可以为空,如上面倒数第二行所示。

我想在查询中通过IDAMOUNT 组执行SUM

结果 SUM 应该是 DECIMAL(16,2)。

考虑到值可以为空和空,并且小数点后的位数不遵循任何固定格式,正确的方法是什么?

它与this question 重复,但给出的答案不完整且不被接受。

感谢阅读!

【问题讨论】:

  • 基本上是if(amount is null OR amount = '') then 0 else amount,在伪代码中。不过,这一栏应该用数字来完成。数字列不允许“空”值,这是一个字符串。一个数字要么是空的,要么是一个数字。

标签: sql db2


【解决方案1】:

我认为你想要的代码是:

select (case when amount <> '' then cast(amount as float) end)
from table t;

您不必担心NULL 值。 sum() 忽略它们。如果要在所有值都是NULL/blank 的情况下获取0,则将else 0 添加到case 语句中。

如果你担心其他非数值,可以试试:

select (case when amount <> '' and
                  not regexp_like(amount, '[^0-9.]', '')
             then cast(amount as float) end
from table t;

【讨论】:

  • 出现以下错误:错误:DB2 SQL 错误:SQLCODE=-461, SQLSTATE=42846, SQLERRMC=SYSIBM.CHARACTER;SYSIBM.DOUBLE, DRIVER=3.50.152
  • @Vicky 。 . .您应该编辑您的问题并显示您正在运行的代码。
  • 翻译语句不正确。我能找到的所有 DB2 翻译规范都是 TRANSLATE(string_expression [, to_string [, from_string [, pad ]]])。我不确定它在其他系统上是如何工作的,但 IBMi 不会为 to 或 from 字符串取空字符串。
  • @彼得。 . .这是一个很好的观点。我把它换成了regexp_like()
【解决方案2】:
CAST(CASE WHEN ISNULL(AMOUNT, '') = '' THEN NULL ELSE REPLACE(AMOUNT, ',', '.') END AS DECIMAL (16,2))  AS AMOUNT

CAST (123.4578 AS DECIMAL (16,2))
+ CAST (NULL AS DECIMAL (16,2))
+ CAST (123.78 AS DECIMAL (16,2))
+ CAST (-8562.85441 AS DECIMAL (16,2))

= RESULT DECIMAL(16,2)

【讨论】:

  • 如果您可以添加一些关于您的答案如何或为什么有效的 cmets 或描述会更有帮助。
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多