何时/为什么Oracle将NaN添加到数据库表中的某一行

She*_*nny 7 sql oracle nan

我知道NaN代表的不是数字.但是,我很难理解Oracle何时以及为何将其添加到行中.

是遇到小于0的值,如负数还是垃圾值.

Ale*_*ole 14

从文件:

Oracle数据库数字数据类型存储正和负固定和浮点数,零,无穷大和值,这些是操作的未定义结果 - "非数字"或NAN.

据我所知,你只能在binary_float或binary_double列中获取NaN ; 这些数据类型也有自己的NaN文字,并且它们也is nan有条件,以及操作它们的nanvl()功能.

获取此类值的方法示例是将零浮点/双精度值除以零:

select 0f/0 from dual;

0F/0
----
NaN  
Run Code Online (Sandbox Code Playgroud)

...所以,如果您看到NaN,您的应用程序逻辑或基础数据可能会被破坏.(注意,你不能用'普通'数字类型得到它; ORA-01476: divisor is equal to zero除非分子是浮点数或双数,否则你得到它.

但是,你不会因为零或负数而获得NaN.你也可能有一个字符串列,一个应用程序正在输入单词'NaN',但是将数字存储为字符串在很多层面都是个坏主意,所以希望情况并非如此.


mmm*_*pie 5

Nope <= 0仍然是一个数字,所以并不完全.NaN(或无穷大)是DB在处理不可计算的数字(+-∞或简单的非数字)时用来保持理智的特殊值.这是一些代码:

DECLARE
  l_bd_test   binary_double;
  l_int_test  INTEGER;
BEGIN
  l_bd_test   := 'NAN';
  l_int_test  := 0;
  IF l_bd_test IS NAN THEN 
    DBMS_OUTPUT.PUT_LINE(l_bd_test || ' IS NAN');
  ELSE
    DBMS_OUTPUT.PUT_LINE(l_bd_test || ' IS A #');
  END IF;
  IF l_int_test IS NAN THEN 
    DBMS_OUTPUT.PUT_LINE(l_int_test || ' IS NAN');
  ELSE
    DBMS_OUTPUT.PUT_LINE(l_int_test || ' IS A #');
  END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)

替代NANINFINITY,甚至否定它,并查看结果.