Когда / Почему 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
или даже отрицают его и видят результаты.