2017-02-27 10 views
0

非常に長い金額をcomma separated value in oracleに変換する必要があります。私はGoogleで検索していました。私は少数のためだけに機能するいくつかの解決策を得ました。しかし、長い番号ではありません。以下は私の解決策です。しかし、正しく動作しません。私は############を得ていた...私は以下を実行する場合。オラクルでコンマで長い数字をフォーマット

SELECT TO_CHAR(6965854565787645667634565432234565432345643265432345643242087, 
'99G999G999G9999', 'NLS_NUMERIC_CHARACTERS=",."') as test 
FROM dual; 

所望の出力:

6,965,854,565,787,645,667,634,565,432,234,565,432,345,643,265,432,345,643,242,087

私を助けてください。前もって感謝します。

+1

この番号はどこから来ていますか、どのデータ型ですか。すでに文字列であればこれを行うことができますが、mathguyは数値としてオラクルの許容精度を超えています。 –

答えて

1

Oracleの数値の有効桁数は38桁を超えることはできません。あなたはそれ以上のものを持っています。

もし私がそうであれば、どのような「量」ですか?私の理解では、Oracleは現実の価値を扱うように設計されています。投稿したサンプル番号にはどのような意味がありますか?

追加::コメントの元のポスター(以下)は、短い数字で同じエラーが表示されていることを示しています(桁数は34桁です)。

2つの問題。最初に、フォーマットモデルには少なくとも必要な桁数(9桁)が必要です。 to_char(100000, '9G999')は、####の出力を生成します。形式モデルでは4桁しか使用できませんが、入力は6桁です。

その後、SQL * Plusのようにフロントエンド・アプリケーションで出力が正しく表示されないことがあります。 SQL * Plusでは、数値列のデフォルトの幅は10です(私は信じています)。これは例えばコマンドset numwidth 38で38に変更できます。 ToadやSQL Developerなどの他のフロントエンドでは、デフォルトの数値幅はグラフィカルユーザーインターフェイスで変更できる設定です。

詳細はを追加しました - 実際にto_charの結果は文字列で、任意の長さのデフォルトの文字列で任意のフロントエンドにOKが表示されなければならないので、数値の幅はおそらく無関係です。 (そして、どのような場合には、それはto_char()の結果を含む文字列の表示には影響しません。)

+1

その数は宇宙の原子の数より多い...;) – BobC

+0

私は38桁以下のこの数字で試しました。 6965854565787645667634565432234565それでも同じ##### ... –

+0

@SreeBhanu - OK、私は私の最初の答えに追加しました。 – mathguy

1
SELECT TO_CHAR(
    6676345654322345654323456432654323456, 
    '999G999G999G999G999G999G999G999G999G999G999G999G999', 
'NLS_NUMERIC_CHARACTERS=",."') as test FROM dual 

    TEST 
    ------------------------------------------------------------ 
     6,676,345,654,322,345,654,323,456,432,654,323,456 
+0

私はそれが動作するかどうかはわかりません。OPが私たちに与えた番号を実際に使用しようとすると、ORA-01481(無効な数値書式モデル)が返されます。 –

+0

これは、更新ごとに38桁の数字を使用しています。 – BobC

+0

'column'コマンドは必要ありません。デフォルトでは、SQL \ * Plusは文字列の最長文字列に対応するように展開されます。 – mathguy

2

クエリを助けることができる以下かどうかを確認してください。

SELECT ltrim(regexp_replace('00' 
    || '6965854565787645667634565432234565432345643265432345643242087', '(...)', ',\1'),',|0') AS t 
FROM dual; 
+0

ありがとうTajinder ..これは..動作します –

1

@AlexPooleは入力が文字列である可能性が高いと指摘しました。

私はそのような雰囲気を感じませんでした。実際にあなたの入力が文字列で、長さが99桁以下であることが分かっている場合は、以下のようにすることができます。文字列が99よりも長い場合は、99を3の十分大きな倍数に置き換えます(または、計算値の代わりに3 * ceil(length(str)/3))。

with 
    inputs (str) as (
     select '12345678912345' from dual 
    ) 
-- WITH clause is only for testing/illustration, not part of the solution 
select ltrim(regexp_replace(lpad(str, 99, ','), '(.{3})', ',\1'), ',') as test 
from inputs; 

TEST 
------------------ 
12,345,678,912,345 
関連する問題