当前位置: 首页 > 面试题库 >

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

梁丘安晏
2023-03-14
问题内容

该查询:

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),该字段可能具有不同的小数位数,并且我不认为要从该值中添加/删除任何内容。

关于如何解决丢失的零问题但仍支持所有可能的十进制长度的任何想法?


问题答案:

这是因为您的解码语句的第三个参数为NULL。根据文档1(我的重点)。

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

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

select decode(1, 0, 0, 0.75)

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

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

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

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

1.我也被抓住了。



 类似资料:
  • 问题内容: 我有一个发出异步请求的函数。我如何从中返回响应/结果? 我尝试从回调中返回值,以及将结果分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应(它们都返回或变量的初始值为任意值) 。 使用jQuery函数的示例: 使用node.js的示例: 使用承诺块的示例: 问题答案: →有关使用不同示例的异步行为的更一般说明,请参见 在函数内部修改变量后 , 为什么变量未更改?-异步

  • 问题内容: 考虑下面的java代码。 输出量 价值的负值如何产生相同的价值? 但是结果不能是因为java中Integer的最大值是。 但是想知道为什么吗?内部正在发生哪种按位运算? 问题答案: 内部正在发生哪种按位运算? Java使用带符号数字的二进制补码表示。因此,更改符号操作包括两个步骤: 反转原始值的位,并 添加到结果中。 的表示如下: 反转产生 加法使其再次成为相同的数字,即 由于整数溢出

  • 我得根据年、月、日、时、分来数次数。(秒统一为零,我不需要秒) 我选择了HashMap作为数据结构。 我没有用“约会”。是因为,Android Devloper这样说。 日期(int year,int month,int Date,int hrs,int min,int sec)API级别1中不推荐使用此构造函数。从JDK 1.1版开始,由calendar.set(年+1900,month,dat

  • 问题内容: 这个问题可能背叛了一个误解,但是我很好奇Python世界的“ Tomcat”是什么。 我所有的Web编程经验都是Java(或Groovy),因此我认为是Java。当我想到制作一个基本的Web应用程序时,我想到了编写一些servlet,构建WAR文件并将其部署在Tomcat或另一个servlet容器中。 在Python中,假设我编写了一些能够响应HTTP请求的代码,我该怎么办?我将如何部

  • 我有以下Java代码: 打印出来的结果是254,但是我不知道这个代码是如何工作的。如果

  • 问题内容: 我有一个简单的程序: 当我运行该程序时,我看到的只是用于输出。我原本希望我们会遇到第一轮,然后是,然后是etc。 这是由于这样的事实,一旦我们尝试在左侧重新声明,其值就会重置为? 如果有人可以指出我的详细情况,那将很棒。 更改为,似乎正在按预期方式打印数字。我对它达到最大32位值的速度感到惊讶! 问题答案: 该问题是由于整数溢出引起的。 在32位二进制补码算法中: 确实确实开始具有2的