2

SQL Anywhere 5 に基づくレガシー システムを使用する必要があります。db アクセス レイヤーは埋め込み SQL を使用する C++ にあります。私が抱えている問題は実際には C++ の問題ではありませんが、埋め込み SQL により、動的に生成できない SQL ステートメントが強制されます。datatype を持つ多くの列を含む多くのテーブルがありますdouble。主なアプリケーションはこれらの列が ではないことを想定していますが、この列のほとんどに制約NULLはありません。NOT NULLアプリケーションのクラッシュを避けるためISNULLに、SQL で多くのを使用します。たとえば、ただ書くのではなく

SELECT d1,d2,d3,d4 FROM table1;

私達は書く

SELECT ISNULL(d1,0),ISNULL(d2,0),ISNULL(d3,0),ISNULL(d4,0) FROM table1;

これまでのところ、問題は解決しました。すべて問題ないようです。たとえばd1、1 行に 1.2345678987654321 が含まれている場合、

SELECT d1 ...

結果は

1.2345678987654321

しかし

SELECT ISNULL(d1,0) ...

結果は

1.234567

この理由は、ダブルと 0 のような数値で ISNULL を呼び出すと、ISNULL の両方の引数がNUMBER(30,6)最初に型変換されるため、d1 が 6 桁に切り捨てられるためと思われます。簡単な修正はこちら

SELECT ISNULL(d1,CAST(0 AS DOUBLE)) ...

これにより、期待どおりの1.2345678987654321結果が得られますが、SQL ステートメントが非常に長くなります。

SELECT ISNULL(d1,CAST(0 AS DOUBLE)),ISNULL(d2,CAST(0 AS DOUBLE)),ISNULL(d3,CAST(0 AS DOUBLE)), ISNULL(d4,CAST(0 AS DOUBLE))

そこで、SQL で文字どおり DOUBLE ゼロを記述するためのより短い方法を見つけようとしました。

SELECT ISNULL(d1,0e0)...またSELECT ISNULL(d1,0.0)...

動作せ、再び 1.234567 が返されます。

SELECT ISNULL(d1,SIN(0))...またSELECT ISNULL(d1,1e-307)...

両方とも動作し、正しい 1.2345678987654321 が得られますが、0 を書き込むだけではどちらも非常に見苦しく見えます。

ここに質問があります。これを短く/読みやすく/問題を完全に回避する方法についてのアイデアはありますか? 私たちの制約の下では、SQL ステートメントを生成することも、DB スキーマを変更することもできません。

4

1 に答える 1

2

v5で機能するかどうかはわかりません.sqlを介してfloatをdoubleとして扱うようにデータベースオプションを設定してみてください
。クエリを実行します

set option FLOAT_AS_DOUBLE = 'ON'

現在の接続のみを保持する場合は、

set TEMPORARY option FLOAT_AS_DOUBLE = 'ON'

その後、クエリの最初のバージョンを使用してみることができます

于 2010-01-06T15:23:03.410 に答える