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

goe*_*goe 4 java sql oracle decode to-char

这个查询:

select nvl(0.75,0) from dual
Run Code Online (Sandbox Code Playgroud)

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

select decode(1,0,null,0.75) from dual 
Run Code Online (Sandbox Code Playgroud)

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

为什么?

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

select decode(1,0,null,to_char(0.75,'0.99')) from dual
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*Ben 6

这是因为在3 的解码语句的参数为NULL; 根据文件1(我的重点).

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

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

select decode(1, 0, 0, 0.75)
Run Code Online (Sandbox Code Playgroud)

并且您可以使用以下NULLIF()函数实现NULL :

select nullif(decode(1, 0, 0, 0.75), 0) ...
Run Code Online (Sandbox Code Playgroud)

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

select case 1 when 0 then null
              else 0.75
       end ...
Run Code Online (Sandbox Code Playgroud)

我也被抓住了.