0

我有一个由第 3 方代码读取的 HSQL 数据库。此第 3 方代码将某些数值转换为 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,然后运行 ​​position 函数并检查它的返回值以查看它是否会转换为 NaN。您知道在 SQL 级别上更有效的解决方案吗?

4

2 回答 2

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)

旧版本的行为类似于您的示例。

于 2012-10-01T18:18:17.667 回答
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 值。

于 2012-10-11T12:00:17.437 回答