2

Oracle 11g では、数値を解析して、値が 0 の場合は小数を削除し、小数の値が 0 と異なる場合は、小数点記号「,」の後に 2 つの 10 進数を保持したいと考えています。

例:

1,00 -> 1
1,001 -> 1
0,203 -> 0,20

等々。

私は非常に洗練されていない方法でそのようなものを手に入れました

select replace(trim(to_char (trunc ('0,2345',2),'9999999990.99')), '.', ',')
from dual

もっとエレガントな方法を知っていますか?出力は char (数値ではない) である必要があります。

4

3 に答える 3

1

それがはるかにエレガントかどうかはわかりませんが、置換が異なるロケールを処理することであると仮定すると、これはうまくいくかもしれません:

with t as (
  select 1.00 as n from dual
  union all select 1.001 from dual
  union all select 0.203 from dual
  union all select 0.2345 from dual
  union all select 112.999 from dual
)
select n, regexp_replace(to_char(trunc(n, 2), '9999999990D00',
  'NLS_NUMERIC_CHARACTERS='',.'''), '[,.]00$', null) as new_n
from t;

         N NEW_N        
---------- --------------
         1           1    
     1.001           1    
     0.203           0,20 
    0.2345           0,23 
   112.999         112,99 

へのnls_param引数によりto_char、小数点記号としてコンマまたはピリオドを使用するかどうかを指定できます。セッションレベルでそれを設定できれば、クエリは少し単純に見えます。弦の端からのregexp_replaceストリップ,00(または.00、やり過ぎだと思うようになる)。


ThinkJet が指摘したように、これregexp_replaceは少し過剰であり、小数点区切り記号が列クラスで定義されているため (そして形式にはグループ区切り記号がありません)、プランで実行できますreplace

with t as (
  select 1.00 as n from dual
  union all select 1.001 from dual
  union all select 0.203 from dual
  union all select 0.2345 from dual
  union all select 112.999 from dual
  union all select 13.08 from dual
)
select n, replace(trim(
    to_char(trunc(n, 2), '9999999990D00', 'NLS_NUMERIC_CHARACTERS='',.''')),
    ',00', null) as new_n
from t;

         N NEW_N        
---------- --------------
         1 1              
     1.001 1              
     0.203 0,20           
    0.2345 0,23           
   112.999 112,99         
     13.08 13,08          

ただし、これが「エレガント」と表現できるかどうかはまだわかりません。

于 2013-07-24T09:48:22.057 に答える