Замена NaN-значения правильным значением

Функция

Замена неверного вещественного значения (NaN-значения) правильным.

Спецификация
 
< синтаксис >::=
Общие правила
  1. < Выражение1 >, < выражение2 > должны быть вещественными значениями (типа REAL, DOUBLE) или приводиться к нему.

Общие правила
  1. Если < выражение1 > имеет значение NaN или +/- INFINITY, функция возвращает значение < выражения2 >, в противном случае – значение < выражения1 >.

  2. Данная функция эквивалентна конструкции СУБД ЛИНТЕР:

    CASE WHEN < выражение1 > IS NOT NAN
    THEN < выражение 1 > ELSE < выражение2 >;
  3. Аргументы могут быть заданы < SQL-параметром >, который должен содержать спецификацию типа данных параметра.

    select nanvl(cast HEXTORAW(? (char(30))) as double, ? (real));
    000000000000F8FF0000000000000000
    0.097
    |    0.0970000028610229|
Примеры
create or replace table test( r1 real, r2 real );
insert into test values(1.1,1.1);
insert into test;
insert into test select cast( HEXTORAW('0000C0FF00000000') ) as real , 2.2;
insert into test select 2.2,  cast( HEXTORAW('0000807F00000000') ) as real;
insert into test select cast( HEXTORAW('0000C0FF00000000') ) as real, cast( HEXTORAW('0000C0FF00000000') ) as real;
insert into test select cast( HEXTORAW('000080FF00000000') ) as real, cast( HEXTORAW('000080FF00000000') ) as real;
insert into test values(3.3,3.3);
insert into test(r2) select cast( HEXTORAW('0000807F00000000') ) as real;
insert into test(r1) select cast( HEXTORAW('0000807F00000000') ) as real;
insert into test(r2) values (5.5);
insert into test(r1) values (5.5);
select * from test order by r1;
|R1   |R2   |
|1.1  |1.1  |
|2.2  |inf  |
|3.3  |3.3  |
|5.5  |     |
|-nan |2.2  |
|-nan |-nan |
|-inf |-inf |
|inf  |     |
|     |     |
|     |inf  |
|     |5.5  |
select sum(r1), sum(nanvl(r1, 0)), count(r2)  from test where r2 is not nan and r2 is not null;
| -nan | 4.39999997615814 | 4 |