3

プロジェクトに2つの異なるデータベース、OracleとApache Derbyを使用しており、両方のデータベースでサポートされているANSISQL構文を可能な限り使用しようとしています。

列のあるテーブルがあります amount_paid NUMERIC(26,2)

Oracle dbを使用していた私の古いコードは、この形式で値を取得する必要がありました

SELECT LTRIM(TO_CHAR(amount_paid,'9,999,999,999,999.99'))

ANSI sql構文を使用して、数値を「9,999,999,999,999.99」の形式のこのような文字列に変換するにはどうすればよいですか?

4

2 に答える 2

5

これは間違ったアプローチだと思います。フォーマットマスクは表示用であるため、プレゼンテーション層の関心事である必要があります。データアクセス層が行うべきことは、単に実行することだけです。

select amount_paid 
from your_table
where ....

この構文は、アプリが接続するデータベースに関係なく機能します。

次に、フォーマットコードをそれが属するフロントエンドに配置します。

于 2010-06-09T18:05:45.820 に答える
1

私の知識は百科事典ではありませんが、私が知る限り、あなたが望むことを行うためのANSI関数はありません(私が間違っていることを知ってうれしいですが:-)。CONVERTは文字セット間で変換しますが、私が見る限り、必要なフォーマット作業を行いません。CASTはデータ型間で値を変換しますが、ここでもフォーマットは行いません。

DerbyがOracleスタイルのTO_CHAR関数をサポートしていない場合は、独自の関数をロールする必要があるかもしれません。それをMY_TO_CHARと呼びましょう。Oracleでは、実装は次のようになります。

FUNCTION MY_TO_CHAR(nValue IN NUMBER,
                    strOracle_format IN VARCHAR2,
                    strDerby_format  IN VARCHAR2)
  RETURN VARCHAR2
IS BEGIN
  RETURN TO_CHAR(nValue, strOracle_format);
END MY_TO_CHAR;

Derbyでは、この関数を同様の方法で定義し、適切な値と形式を使用して、DerbyのTO_CHARに相当するものをDerby形式の文字列で呼び出します。

編集:@APCに同意します-基本的にフロントエンドの作業をバックエンドで実行する必要がない場合、これらの問題の多くは解消されます。

共有してお楽しみください。

于 2010-06-09T18:09:27.337 に答える