Замена NaN-значения правильным значением (NANVL)
Функция
Замена неверного вещественного значения (NaN-значения) правильным.
Спецификация
<синтаксис>
::=NANVL(выражение1, выражение2)
Общие правила
-
<Выражение1>,<выражение2>должны быть вещественными значениями (типаREAL,DOUBLE) или приводиться к нему.
Общие правила
-
Если
<выражение1>имеет значениеNaNили+/-INFINITY, функция возвращает значение<выражения2>, в противном случае – значение<выражения1>. -
Данная функция эквивалентна конструкции СУБД ЛИНТЕР:
CASE WHEN <выражение1> IS NOT NAN THEN <выражение 1> ELSE <выражение2>;
-
Аргументы могут быть заданы
<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 |