此查询:
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),可能有不同的小数位数,我不想添加/删除该值的任何内容。
有关如何修复缺失零问题但仍支持所有可能的小数长度的任何想法?
答案 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