十进制数,to_char和Oracle

时间:2010-01-09 15:01:20

标签: sql oracle

我试图找出to_char()的格式规范,它会给我以下结果。

to_char(0.1, '[FORMAT_SPEC]')

给出0.1和:

to_char(1, '[FORMAT_SPEC]')

给出1。

我尝试过以下解决方案:

to_char(0.1)

给出'.1'。

to_char(0.1, 'FM0.099')

给出0.1,但没关系:

to_char(1, 'FM0.099')

给出1.0,这是不行的。

你有什么建议吗?

4 个答案:

答案 0 :(得分:5)

返回的精度需要保持一致,因此唯一的选择是使用DECODECASE语句有条件地返回您需要的内容:

CASE 
  WHEN INSTR(TO_CHAR(t.col), '.') = 0 THEN TO_CHAR(t.col)
  ELSE TO_CHAR(t.col, 'FM0.099')
END

示例并不是很好 - 不清楚您的数据是否会包含1.000之类的值或高于1 /等的值。

编辑迈克尔-O(2013-06-25):对于那些需要傻逼的人,你可以试试:

case
  when instr(to_char(<col>), (select to_char(0, 'FMD') from dual))  = 0
    then to_char(<col>) 
  else to_char(<col>, 'FM999990D999')
end

它会自动观察小数点分隔符。将secodn格式模式调整为您的数字大小。

答案 1 :(得分:2)

我只是用这个:

TRIM('.' FROM TO_CHAR(x, 'FM99990.999'))

答案 2 :(得分:0)

不要碰巧有一个Oracle实例来测试它,但我认为

TO_CHAR(1, 'FM0.999')

做到这一点。

答案 3 :(得分:0)

不确定您期望的值范围,但您可以将值&lt; 1与那些&gt; = 1.否则尾随0或小数将会妨碍你:

select val,
       case when val < 1 then to_char(val, 'FM99990.9')
            else to_char(val, 'FM99999')
       end fmt
  from (select 0.1 val from dual union all
        select 1 from dual
       )
/

       VAL FMT
---------- --------
        .1 0.1
         1 1