サードパーティのコードによって読み取られる HSQL データベースがあります。このサードパーティ コードは、特定の数値を Double.NaN に変換します。私の仕事は、これらの数値を null に置き換えることができる SQL クエリを作成することです。
この項目HSQLDB ステートメントと 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レベルでより効果的なソリューションを知っていますか?