それがはるかにエレガントかどうかはわかりませんが、置換が異なるロケールを処理することであると仮定すると、これはうまくいくかもしれません:
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
ただし、これが「エレガント」と表現できるかどうかはまだわかりません。