我有一个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级别上更有效的解决方案?
答案 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值。