Sql 通过在oracle中向数字格式添加小数来更改数字格式

Sql 通过在oracle中向数字格式添加小数来更改数字格式,sql,oracle,Sql,Oracle,我有一个数字000005500,我希望它的格式为0000055.00或55.00,使用Oracle select查询 我使用了这个查询: select to_char(to_number(000005500),'99.99') from dual 但它的展示 如何以我需要的格式显示它?正如所写的那样,您的to_号码调用只是对字符串进行隐式转换,然后再显式转换回数字,这似乎毫无意义,但我假设您实际上是在处理varchar2列中的值。在这种情况下,您会看到: select to_char(to_n

我有一个数字000005500,我希望它的格式为0000055.00或55.00,使用Oracle select查询

我使用了这个查询:

select to_char(to_number(000005500),'99.99') from dual
但它的展示

如何以我需要的格式显示它?

正如所写的那样,您的to_号码调用只是对字符串进行隐式转换,然后再显式转换回数字,这似乎毫无意义,但我假设您实际上是在处理varchar2列中的值。在这种情况下,您会看到:

select to_char(to_number('000005500'),'99.99') from dual

TO_CHA
------
######
您看到散列是因为无法将四位数5500放入99.99格式—小数点前有四位数,格式掩码只允许两位数

您似乎缺少的位是除以100得到小数:

select to_char(to_number('000005500') / 100,'99.99') from dual;

TO_CHA
------
 55.00
另一种方法是,如果希望将其保留为一个前导零数与原始值相同的字符串,则将其保留为一个字符串,用substr将其切碎,然后将各部分重新连接在一起。使用CTE作为演示:

with t as (select '000005500' as val from dual)
select val, substr(val, 1, length(val) - 2)
  || '.' || substr(val, length(val) - 1, 2) as adj_val
from t;

 VAL       ADJ_VAL
--------- ---------------------------------------------
000005500 0000055.00
正如所写的,您的to_number调用只是对字符串进行隐式转换,然后再显式转换回数字,这似乎毫无意义,但我假设您实际上是在处理varchar2列中的值。在这种情况下,您会看到:

select to_char(to_number('000005500'),'99.99') from dual

TO_CHA
------
######
您看到散列是因为无法将四位数5500放入99.99格式—小数点前有四位数,格式掩码只允许两位数

您似乎缺少的位是除以100得到小数:

select to_char(to_number('000005500') / 100,'99.99') from dual;

TO_CHA
------
 55.00
另一种方法是,如果希望将其保留为一个前导零数与原始值相同的字符串,则将其保留为一个字符串,用substr将其切碎,然后将各部分重新连接在一起。使用CTE作为演示:

with t as (select '000005500' as val from dual)
select val, substr(val, 1, length(val) - 2)
  || '.' || substr(val, length(val) - 1, 2) as adj_val
from t;

 VAL       ADJ_VAL
--------- ---------------------------------------------
000005500 0000055.00
首先,000005500不是一个数字。数字不是以零开始的。你正在处理一个字符串

我希望它的格式是0000055.00

您只能期望它是一个字符串作为输出,而不是一个数字

无论如何,要将输出设置为55.00 as NUMBER,可以执行以下操作-

SQL> WITH DATA AS(
  2  SELECT '000005500' num FROM DUAL
  3  )
  4  SELECT to_char(to_number(replace(num,'0','')),'99D99') FROM DATA
  5  /

TO_CHA
------
 55.00

SQL>
或者

编辑

Alex的方法也很好,它使用简单的数学将其转换为十进制。第一部分我更喜欢他的方式。

首先,000005500不是一个数字。数字不是以零开始的。你正在处理一个字符串

我希望它的格式是0000055.00

您只能期望它是一个字符串作为输出,而不是一个数字

无论如何,要将输出设置为55.00 as NUMBER,可以执行以下操作-

SQL> WITH DATA AS(
  2  SELECT '000005500' num FROM DUAL
  3  )
  4  SELECT to_char(to_number(replace(num,'0','')),'99D99') FROM DATA
  5  /

TO_CHA
------
 55.00

SQL>
或者

编辑


Alex的方法也很好,它使用简单的数学将其转换为十进制。第一部分我更喜欢他的方式。

关于最终格式,还有两种选择:

select to_char(to_number('000005500')/100,'0999999D90') leading_zeros,
       to_char(to_number('000005500')/100,'fm9999999D90') no_leading_zeros
from dual;

围绕最终格式的另外两个备选方案:

select to_char(to_number('000005500')/100,'0999999D90') leading_zeros,
       to_char(to_number('000005500')/100,'fm9999999D90') no_leading_zeros
from dual;

只有当原始文件中的最后两位数为零时,这两个数字才起作用;如果值是,比如说,“000005501”,那么它仍然与格式不匹配?是的,我只是对OP给出了具体的答案。它不能被概括。只有当原始值中的最后两个数字是零时,这两个值才起作用;如果值是,比如说“000005501”,那么它仍然与格式不匹配?是的,我只是给了OP一个具体的答案。它不能被推广。除以100得到小数点很简单!谢谢你,亚历克斯。很好的解决方案!!除以100得到小数点很简单!谢谢你,亚历克斯。很好的解决方案!!表示格式小于要显示的实际数字。有些函数,比如这个函数,实际上没有假设任何东西,需要定义每个可能的数字。如果您的表不包含值为5500的行,则可能没有给出任何错误。包括:存储数据类型的最大位数是多少?至少要有这样的格式。所示示例的逗号前有9位数字,格式为2位。2比9小,所以这是个错误。表示格式小于要显示的实际数字。有些函数,比如这个函数,实际上没有假设任何东西,需要定义每个可能的数字。如果您的表不包含值为5500的行,则可能没有给出任何错误。包括:存储数据类型的最大位数是多少?至少要有这样的格式。所示示例的逗号前有9位数字,格式为2位。2比9小,所以这是个错误。