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 スキーマを変更することもできません。