Возвращаемая точность должна быть согласованной, поэтому единственной альтернативой является использование операторов DECODE или CASE для условного возврата того, что вам нужно:
CASE
WHEN INSTR(TO_CHAR(t.col), '.') = 0 THEN TO_CHAR(t.col)
ELSE TO_CHAR(t.col, 'FM0.099')
END
Пример не велик - неясно, будут ли ваши данные иметь такие значения, как 1.000
или значения выше единицы / и т.д.
РЕДАКТИРОВАТЬ Michael-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 к размеру вашего номера.