Когда / Почему Oracle добавляет NaN в строку таблицы базы данных

Я знаю, что NaN означает не число. Но, мне трудно понять, когда и почему Oracle добавляет эту строку.

Это когда он встречает значение меньше 0, как отрицательное число или когда его значением мусора.

2 ответов


из документации:

числовые типы данных базы данных Oracle хранят положительные и отрицательные фиксированные и числа с плавающей запятой, ноль, бесконечность и значения, которые являются неопределенным результатом операции-"не число" или NAN.

насколько я знаю, вы можете получить NaN только в binary_float и binary_double столбец; эти типы данных имеют их собственные литералы для NaN тоже и там is nan условие для них тоже, и nanvl() функции чтобы манипулировать ими.

пример способа получить такое значение-разделить нулевое значение float / double на ноль:

select 0f/0 from dual;

0F/0
----
NaN  

... поэтому, если вы видите NaNs, логика приложения или базовые данные могут быть нарушены. (Обратите внимание, что вы не можете получить это с "нормальным" типом номера; вы получаете ORA-01476: divisor is equal to zero если числитель не является float или double).

вы не получите NaN для нуля или но отрицательные цифры. Также возможно, что у вас есть строковый столбец, и приложение помещает слово "NaN", но хранение чисел в виде строк-плохая идея на многих уровнях, поэтому, надеюсь, это не так.


Nope

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;
/

заменить NAN на INFINITY или даже отрицают его и видят результаты.