【问题标题】:Values are not displaying with leading zero in oracle在 oracle 中,值未以前导零显示
【发布时间】:2018-12-18 12:11:14
【问题描述】:

我有一个表,其中的数据带有前导零的列(number 数据类型)。当我尝试在 apex - SQL Workshop 中查询该列时,它不显示前导零。所以我需要手动转换为带有前导零的显示值。但是转换时出现问题。

如果我使用to_char 显式格式化,那么它会影响正常值。 例如

select to_char(colA,'0.99') from tab1 

当值为 0.87 时会给我 0.87,但我们也有没有小数的值。在这种情况下,它会给我###。基本上我想按原样显示值(但如果值以十进制开头,则添加 0)。它也不应该添加尾随零。有没有办法做到这一点?例如,下面将给出 661.00。但它不应该给。如果是整数,应该显示相同的值。

select to_char(661,'999G999G999G999G990D00MI') from dual 

【问题讨论】:

  • 数字没有前导零。它们以内部格式存储。
  • @GordonLinoff,谢谢。那么当值至少以十进制开头时,我如何获得前导零以用于显示目的?
  • 也许您只需在格式掩码中将“9”编辑为“0”

标签: sql oracle oracle-apex number-formatting


【解决方案1】:

还认为您的格式掩码是错误的 D99 应该有所帮助:

SQL> with a as
 2  (      select 1/100 nb, '0.01' res from dual
 3  union  select 20 nb, '20' res from dual
 4  union  select 444/100 nb, '4.44' res from dual
 5  union  select 120/100 nb, '1.2' res from dual)
 6  select nb, to_char(nb,'999G990D99') t_c, res from a

       NB       T_C         RES 
       ,01      0,01        0.01
       1,2      1,20        1.2 
       4,44     4,44        4.44
       20       20,00       20  

【讨论】:

  • 您转换后的T_C 值与其中两行的硬编码RES 值不匹配,所以我不确定这显示的是什么。
【解决方案2】:

您可以使用 'FM999999990D9999' 之类的掩码来接近,小数点后每侧都有适当的 9 以涵盖您可能拥有的所有值。

with tab1 (cola) as (
         select 0.87 from dual
  union  select 661 from dual
  union  select 661.87 res from dual
  union  select 1.5 res from dual
)
select cola, to_char(cola, 'FM999999990D9999')
from tab1;

      COLA TO_CHAR(COLA,'F
---------- ---------------
       .87 0.87           
       1.5 1.5            
       661 661.           
    661.87 661.87         

FM 删除尾随零和前导空格(包括 +/- 符号的标称空格)。

要去掉尾随的小数点标记,您需要将其修剪掉:

with tab1 (cola) as (
         select 0.87 from dual
  union  select 661 from dual
  union  select 661.87 res from dual
  union  select 1.5 res from dual
)
select cola, rtrim(to_char(cola, 'FM999999990D9999'), to_char(0, 'FMD'))
from tab1;

我在这两个部分都坚持使用D;您可以在两者中使用固定的.,因此您不需要第二个to_char() 调用来转换它,但您可能希望它由会话控制 - 无论哪种方式都需要保持一致。


如果您不知道需要包含多少个 9,您可以根据小数点分隔符前后的位数为每个数字生成一个定制的格式掩码:

with tab1 (cola) as (
            select 0.87 from dual
  union all select 661 from dual
  union all select 661.87 res from dual
  union all select 1.5 res from dual
  union all select 0.00045354543 from dual
)
select cola,
  'FM' || lpad('0', length(trunc(cola)), '9')
       || case when trunc(cola) != cola
               then 'D' || rpad('9', length(cola - trunc(cola)) - 1, '9')
          end as format_mask,
  to_char(cola,
    'FM' || lpad('0', length(trunc(cola)), '9')
         || case when trunc(cola) != cola
                 then 'D' || rpad('9', length(cola - trunc(cola)) - 1, '9')
            end) as result
from tab1;

           COLA FORMAT_MASK          RESULT              
--------------- -------------------- --------------------
            .87 FM0D99               0.87                
            661 FM990                661                 
         661.87 FM990D99             661.87              
            1.5 FM0D9                1.5                 
   .00045354543 FM0D99999999999      0.00045354543       

这依赖于隐式转换,但似乎适用于正数、负数和零。它不需要修剪结果,因为小数分隔符 D 只包含在非整数中。

【讨论】:

  • 谢谢!您是否也可以在 apex 交互式报告中帮助执行此操作?我在报告属性下有此列。我应该把这个条件显示?
  • 恐怕我对 Apex 一无所知。
  • 好的。我这里有个问题。我不知道小数点后会有多少个值。但我想显示所有值而不四舍五入。现在select rtrim(to_char('0.00045354543', 'FM999999990D9999'), to_char(0, 'FMD')) from dual 给了我0.0005 但它应该是所有的值。
  • 所以需要多加9;您需要了解您需要处理的值的范围,以便能够允许足够的 - 即小数点之后(和之前)的最大位数。或者,你需要根据值来构建格式模型,这听起来很奇怪,但可以工作。
  • @Crazy2crack - 我添加了一种方法来为每个值生成定制的格式掩码。
【解决方案3】:

如何在查询中使用 case 语句来查询相关列?

类似这样的:

select case 
when INSTR(to_char(:test_no),'.') = 1
then replace(to_char(:test_no),'.','0.')
else to_char(:test_no)
end as 'test_no'
from dual

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多