【问题标题】:How do I set precision & scale when using CAST in Oracle?在 Oracle 中使用 CAST 时如何设置精度和比例?
【发布时间】:2015-07-24 14:45:03
【问题描述】:

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

我想添加最小和最大精度。例如,1234567.89 中小数点左侧的整数应该最小为 1,但最大为 5(因此多余的整数将被修剪)。此外,我想对比例做同样的事情 - 右边的小数,通过设置最少两位小数和最多四位小数。这些数字只是示例,数字会动态更新。

根据我的阅读,我必须在 CAST 的 type_name 中以某种方式设置精度和比例,但我不确定如何使用多个最小值和最大值来做到这一点。我是 Oracle 菜鸟,如果有任何帮助,我将不胜感激!

【问题讨论】:

  • 如果您尝试将变量转换为 varchar(即字符串),那么最小/最大精度不适用...您是否尝试将数字转换为字符串?还是字符串转数字?
  • 请使用示例数据和所需结果编辑您的问题。在 SQL 的上下文中,规模和精度的最小值和最大值是什么并不清楚。
  • @Ditto,感谢您的回复。我正在尝试将数字转换为字符串。如果我使用 To_Char,它看起来像这样: To_Char($Num,'FM' || RPAD(RPAD(LPAD(LPAD('.',least($intmaxlength,$intminlength)+1,'0'),$ intmaxlength+1,'9'),$intmaxlength+1+$decminlength,'0'),$intmaxlength+1+$decmaxlength,'9'))
  • @GordonLinoff,感谢您的耐心等待,这是我在 StackOverflow 上的第一个问题。我用更好的例子重写了这个问题并提高了清晰度。如果我需要详细说明,请告诉我。
  • 我不相信 CAST 会做你想做的事 .. 现在尝试一些事情 ..

标签: sql oracle plsql relational-database


【解决方案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>

[/编辑]

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

  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;

[/编辑]

【讨论】:

  • 感谢您的回复。正如我所提到的,最小和最大整数和小数位数不是固定的,所以我认为 99990.0099 通常不会起作用。
  • 您能详细说明一下吗?
  • 关于为什么 CAST 不能做到这一点以及我如何使用字符串来调整它。
【解决方案2】:

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

首先,要在 Oracle 中执行此操作,我同意同上的观点,即 to_char 是要使用的函数。 我们需要指定一个数字格式,一般看起来像这样:'FM0999.0099'

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

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

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

【讨论】:

    【解决方案3】:

    您可以具有跨平台兼容性,但您需要选择准确的精度和比例。您可以通过转换为小数来做到这一点:

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

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

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

    您问题中的问题是“1 到 5”小数位的模糊概念。你必须选择你真正想要的数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      相关资源
      最近更新 更多