【发布时间】:2012-10-01 10:15:58
【问题描述】:
我有一个由第 3 方代码读取的 HSQL 数据库。此第 3 方代码将某些数值转换为 Double.NaN。我的任务是编写一个 sql 查询,可以将这些数值替换为 null。
在这个项目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 级别上更有效的解决方案吗?
【问题讨论】: