我有一个oracle解码器,它在更新小数精度之前检查值是否为NULL。问题是当price_precision列中的值不为null时,解码仍然会转到d.price值,但它应该转到默认值。以下是解码的代码行:
DECODE(d.PRICE_PRECISION, NULL, d.price,TO_CHAR(DECODE(d.price,NULL, '', d.price), CONCAT('9999990',RPAD('D', d.PRICE_PRECISION+1,'9')))) price
我知道Price _Precision列中存在非NULL数据,因为我可以在select语句的返回中看到它。我的解码有问题吗?解码为什么没有进入默认语句?
答案 0 :(得分:1)
似乎发生了隐式转换。考虑一下这个
DECODE(d.PRICE_PRECISION, NULL, to_char(d.price), TO_CHAR....
来自Oracle docs:
Oracle自动将
expr
和每个search
值转换为。{ 比较前第一个search
值的数据类型。神谕 自动将返回值转换为与。相同的数据类型 第一个result
。
答案 1 :(得分:0)
对于Null值,请使用NVL函数。
从表中选择nvl(名称,“未注册”); 名称为空值时,返回“未注册”。
您可以将其与DECODE功能一起使用。
decode(nvl(PRICE,'无效'),'无效',0,PRICE)
在计算中,这避免了问题。
来自Oracle docs: