为什么Oracle的DECODE给我的价值与NVL不同?

时间:2013-09-11 19:46:51

标签: java sql oracle decode to-char

此查询:

select nvl(0.75,0) from dual

给了我0.75(数字)但是这个查询:

select decode(1,0,null,0.75) from dual 

给了我'.75'(字符串)。

为什么?

我尝试通过将第二个查询更改为:

来解决此问题
select decode(1,0,null,to_char(0.75,'0.99')) from dual

但在我的实际代码中,0.75将是一个字段(NUMBER),可能有不同的小数位数,我不想添加/删除该值的任何内容。

有关如何修复缺失零问题但仍支持所有可能的小数长度的任何想法?

4 个答案:

答案 0 :(得分:6)

这是因为你的decode语句的3 rd 参数是NULL;根据{{​​3}} 1 (我的重点)。

  

Oracle在比较之前自动将expr和每个搜索值转换为第一个搜索值的数据类型 ....如果第一个结果的数据类型为CHAR,或者如果第一个结果为为null,然后Oracle将返回值转换为数据类型VARCHAR2

在您的情况下,第一个结果是NULL,Oracle将其视为VARCHAR2。您的返回值被隐式转换为VARCHAR2。如果您将DECODE()更改为以下内容,则会获得一个数字:

select decode(1, 0, 0, 0.75)

您可以使用the documentation函数实现NULL:

select nullif(decode(1, 0, 0, 0.75), 0) ...

最好使用CASE语句,该语句强制所有返回的数据类型都相同:

select case 1 when 0 then null
              else 0.75
       end ...

<子> 1。我也被抓住了。

答案 1 :(得分:2)

您可以使用

select decode(1,0,to_number(null),0.75) from dual

答案 2 :(得分:1)

在第一种情况下,nvl()返回一个数值。如何显示这取决于您用于运行查询的程序。 TOAD 就像你说的那样显示它,0.75。

在第二个示例中,decode()返回varchar2。当Oracle将数字转换为没有任何格式的字符串时,这就是你得到的,即“.75”。

来自decode()上的Oracle文档:

  

如果第一个结果的数据类型为CHAR,或者第一个结果是   null,然后Oracle将返回值转换为数据类型VARCHAR2。

您可以使用数字格式和rtrim()来实现您的目的,例如:

select rtrim(to_char(.75, '9990.99999999999999'),'0') from dual;

结果:

0.75

答案 3 :(得分:0)

select to_number(decode(1,0,null,0.75)) from dual