0

サードパーティのコードによって読み取られる 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レベルでより効果的なソリューションを知っていますか?

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 に答える