2014-09-16 3 views
8

Мне нужно проверить, не является ли числовое значение поплавка в PostgreSQL числом (NaN). Обратите внимание, что "PostgreSQL treats NaN values as equal", поэтому this C++ trick doesn't work. Как я не вижу каких-либо isnan функции в PostgreSQL 9.3, вот моя лучшая попытка сделать один:Как проверить, является ли число NaN

create or replace function isnan(double precision) returns boolean as 
    $$select $1::text = 'NaN'::text$$ language sql; 

Есть ли лучший способ проверить на NaN с?

ответ

8

Есть ли лучший способ проверить NaN?

Просто сравните равенство:

SELECT double precision 'NaN' = double precision 'NaN'; 

, как, согласно документации вы связаны с, Pg лечит NaN с равными. Я удивлен этим, учитывая, что он правильно относится к NULL как не равный любому другому NULL и ожидал бы NaN = NaN, чтобы вернуть NULL, но ... ну, это работает.

Или, если вы хотите функцию:

create or replace function isnan(double precision) 
language sql 
immutable 
returns boolean as $$ 
select $1 = double precision 'NaN' 
$$; 
+0

Будучи относительно новым plpgsql, мне кажется, что с 'float' ==' float8' == 'double precision' (по крайней мере, в текущее время), вы, вероятно, захотите выбрать один синоним и использовать его последовательно. –

+0

@DavidJ. Хех, скорее. –

+0

Что значит «хе, а»? –

2

Любое значение NaN принимается со знаком минус еще является значение NaN (как ноль), так что вы можете попробовать это:

create or replace function isnan(double precision) returns boolean as $$ 
select $1 = -$1 and $1 != 0.0 $$ language sql; 

или:

create or replace function isnan(double precision) returns boolean as $$ 
select $1 = -$1 and $1 = $1 + 1.0 $$ language sql; 

Насколько PostgreSQL лечит NaN значения больше всех значений, не NaN, следующий прием возможен:

create or replace function isnan(double precision) returns boolean as $$ 
select $1 > 0 and -$1 > 0 $$ language sql; 
-3

Для Google BigQuery (и, возможно, других SQL-серверов вне там), используйте следующие

SELECT * FROM [project:dataset.table] 
WHERE IS_NAN(field) = true 
+0

Вопрос о postgresql, где IS_NAN не определен –

Смежные вопросы