我有一个由第 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 级别上更有效的解决方案吗?