【问题标题】:How to check if number is NaN如何检查数字是否为 NaN
【发布时间】:2014-11-09 14:49:49
【问题描述】:

我需要测试 PostgreSQL 中的数字/浮点值是否不是数字 (NaN)。请注意"PostgreSQL treats NaN values as equal"。由于我在 PostgreSQL 9.3 中没有看到任何 isnan 函数,因此这是我最好的尝试:

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

有没有更好的方法来测试NaNs?

【问题讨论】:

    标签: postgresql nan


    【解决方案1】:

    任何带有减号的 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;
    

    【讨论】:

      【解决方案2】:

      有没有更好的方法来测试 NaN?

      简单比较是否相等:

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

      根据您链接到的文档,Pg 将NaNs 视为平等。我对此感到惊讶,因为它正确地将NULL 视为不等于任何其他NULL,并且期望NaN = NaN 返回NULL,但是......好吧,它有效。

      或者如果你想要一个函数:

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

      【讨论】:

      • 对 plpgsql 来说相对较新,在我看来,因为 float == float8 == double precision(至少在当前时间),你可能想要选择一个同义词并始终如一地使用它。
      【解决方案3】:

      对于 Google BigQuery(可能还有其他 sql 服务器),请使用以下命令

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

      【讨论】:

      • 问题是关于postgresql,其中IS_NAN没有定义
      【解决方案4】:

      您还可以使用类型转换来创建一个实际的NaN 值以进行比较:

      SELECT *
      FROM (VALUES
          (1, 100),
          (2, 'NaN'::NUMERIC),
          (3, 300)
      ) A
      WHERE column2 = 'NaN'::NUMERIC;
      

      仅匹配 NaN 值:

      column1 | column2
      --------+--------
            2 |    NaN
      

      【讨论】:

        猜你喜欢
        • 2016-11-14
        • 2012-07-11
        • 2011-02-08
        • 2013-08-22
        • 2018-02-03
        • 1970-01-01
        • 2012-10-29
        相关资源
        最近更新 更多