Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Oracle';s解码给我一个不同于NVL的值?_Java_Sql_Oracle_Decode_To Char - Fatal编程技术网

Java 为什么Oracle';s解码给我一个不同于NVL的值?

Java 为什么Oracle';s解码给我一个不同于NVL的值?,java,sql,oracle,decode,to-char,Java,Sql,Oracle,Decode,To Char,此查询: select nvl(0.75,0) from dual select decode(1,0,null,0.75) from dual 为我提供0.75(数字),但此查询: select nvl(0.75,0) from dual select decode(1,0,null,0.75) from dual 给我'.75'(字符串) 为什么? 我试图通过将第二个查询更改为: select decode(1,0,null,to_char(0.75,'0.99')) from

此查询:

select nvl(0.75,0) from dual
select decode(1,0,null,0.75) from dual 
为我提供
0.75
(数字),但此查询:

select nvl(0.75,0) from dual
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将是一个可能有不同小数位数的字段(数字),我不想从该值中添加/删除任何内容

关于如何修复丢失的零问题,但仍然支持所有可能的十进制长度,有什么想法吗?

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

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

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

select decode(1, 0, 0, 0.75)
您可以通过使用以下函数实现空值:

select nullif(decode(1, 0, 0, 0.75), 0) ...
最好使用CASE语句,它强制所有返回的数据类型都相同:

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

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

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

从Oracle文档的
decode()

如果第一个结果具有数据类型CHAR,或者如果第一个结果为 null,则Oracle将返回值转换为数据类型VARCHAR2

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

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

0.75
你可以用

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

什么?请描述更多!你们想说什么?在解码函数中,若第一个结果参数是字符串,那个么oracle会隐式地将另一个结果参数转换为字符串。在这种情况下,null被视为字符串,因此oracle将0.75转换为字符串,并给出.75。如果您使用到_number(null),则该null将转换为数字,oracle将结果给出为0.75。出于其他地方解释的各种原因,您应该尝试使用Coalesce()而不是Nvl(),使用case而不是Decode()。