HSQL过滤NaN有效

时间:2012-10-01 10:15:59

标签: java hsqldb

我有一个HSQL数据库,由第三方代码读取。此第三方代码将某些数值转换为Double.NaN。我的任务是编写一个可以用null替换这些数值的SQL查询。

在这个项目HSQLDB Statement and Java NaN doubles我读到sqrt(-1)或0.0 / 0.0将被翻译为NaN。但是,测试相等性对于这个值来说有点奇怪。请考虑以下问题:

select
    casewhen(1=1, 1, 0), -- this one is to make sure that casewhen works as we expect
    casewhen(sqrt(-1)=sqrt(-1), 1, 0), -- this one looks good, we'll see
    casewhen(sqrt(-1)=1, 1, 0) -- this is the odd part, we'll see
from mytable; -- any table with at least 1 row will do

它返回如下行:

C1 C2 C3
 1  1  1

看起来sqrt(-1)等于每个数字。我可以这样调整它:

select
    casewhen(1=1, 1, 0),
    casewhen(
        position(
                 '0E0/0E0' in
                 cast(sqrt(-1) to varchar(40))
                ) = 1,
        'NaN', 'Numeric')
 from mytable;

它返回我需要的东西:

C1  C2
 1 NaN

但是我不满意:这个解决方案需要从numeric到varchar的转换,然后运行位置函数并检查它的返回值以查看它是否会转换为NaN。您是否知道SQL级别上更有效的解决方案?

2 个答案:

答案 0 :(得分:1)

这与HSQLDB 2.2.9(或更高版本)一样正常。

第一个SELECT语句返回1,1,0

试试这个,它只返回具有NaN值的行:

create table t (c varchar(40), d double)
insert into t values (cast (sqrt(-1) as varchar(40)), sqrt(-1))
insert into t values (cast (-1 as varchar(40)), -1)
select * from t where d = sqrt(-1)

旧版本的行为与您的示例相似。

答案 1 :(得分:0)

我找到了一个更快的解决方法:

select
    casewhen(5 = 5 + 1, 1, 0),
    casewhen(sqrt(-1) = sqrt(-1) , 1, 0)
from mytable;

将返回如下行:

C1 C2
 0  1

因此,(x = x + 1)仅适用于NaN值。