如何设置精度和在Oracle中使用CAST时的扩展?

时间:2015-07-24 14:45:03

标签: sql oracle plsql relational-database

目前我有CAST($ Variable AS varchar2(30))。

我想添加最小和最大精度。例如,1234567.89中小数点左侧的整数应至少为1但最多为5(因此将修剪额外的整数)。另外,我希望通过设置最小两位小数和最多四位来缩放比例 - 右边的小数。这些数字只是示例,数字将动态更新。

根据我的阅读,我必须在CAST中的type_name中以某种方式设置精度和比例,但我不确定如何使用每个的最小值和最大值。我是甲骨文的菜鸟,所以我很感激任何帮助!

3 个答案:

答案 0 :(得分:1)

我不相信CAST可以做你想做的事情,但是,TO_CHAR的格式正确可以..

不确定跨平台兼容性,但是抱歉:

  SQL> select to_char('123.45','FM99990.0099') from dual;

  TO_CHAR('12
  -----------
  123.45

  SQL> select to_char('123123.45','FM99990.0099') from dual;

  TO_CHAR('12
  -----------
  ###########

  SQL> select to_char('123.41235','FM99990.0099') from dual;

  TO_CHAR('12
  -----------
  123.4124

请注意,当您只限制"限制"十进制左边的数字为5,给出一个更大的数字会产生一个"错误"所有散列标记的样式输出" #####"。

[编辑] 您可以通过基于传入输入构建格式模型来调整格式模型:

  SQL> select 'FM' || lpad('0',5,'9') || '.' || rpad('00',4,'9') from dual;

  'FM'||LPAD('
  ------------
  FM99990.0099

  SQL> select 'FM' || lpad('0',7,'9') || '.' || rpad('00',2,'9') from dual;

  'FM'||LPAD('
  ------------
  FM9999990.00

  SQL>

[/编辑]

[EDIT2] 例如:你可以像这样把它们放在一起:

  SQL> !cat q.sql
  Accept len prompt "Length:"
  accept prec prompt "Precision:"

  select to_char('123.45','FM' || lpad('0',&len,'9') || '.' || rpad('00',&prec,'9'))
   from dual;

[/编辑]

答案 1 :(得分:0)

这里似乎有3个问题:1)配置小数点右侧的位数,2)配置左侧的位数3)以可跨多个数据库移植的方式执行此操作

首先,要在Oracle中执行此操作,我同意Ditto,to_char是要使用的函数。 我们需要指定一种数字格式,通常如下所示:'FM0999.0099'

问题1可以通过调整右侧的“.0099”部分来解决。两个零点确保小数点右侧至少有两位数字(必要时填零),后面两个9位右侧最多4位数字。

关于问题2,配置最小位数需要注意。通常,我们希望此最小值足以表示给定的数字。只需在左侧填充零填充即可调整最大值。 为此,我们需要通过指定足够的9来调整格式左侧的'0999'部分,并在左侧添加一个更多的0来指定左边的最大位数。

确保跨数据库的可移植性是一项挑战。在其他数据库中,我们可能必须使用完全不同的函数,如CONVERT。

答案 2 :(得分:0)

您可以具有跨平台兼容性,但您需要选择精确的精度和比例。您可以通过转换为小数来执行此操作:

select cast(val as decimal(10, 2))

如果需要字符串,则将小数转换为字符串:

select cast(cast(val as decimal(10, 2)) as varchar(255))

你的问题中的问题是" 1到5"小数位。你必须选择你真正想要的号码。