我有一个表,其中有一个列的前导零数据( number 数据类型)。当我尝试查询apex-SQL Workshop中的列时,它没有显示前导零。因此,我需要手动将其转换为带有前导零的显示值。但是转换时会出现问题。
如果我显式使用to_char
格式化,则它将影响正常值。
例如
select to_char(colA,'0.99') from tab1
当值是.87时,会给我 0.87 ,但我们也有不带小数的值。在这种情况下,它将给我###。基本上我想按原样显示值(但如果值以十进制开头,则添加0)。它也不应添加尾随零。是否有任何方法可以实现呢?例如,下面将给出 661.00 。但这不应该给。如果是整数,则应显示相同的值。
select to_char(661,'999G999G999G999G990D00MI') from dual
答案 0 :(得分: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。
答案 1 :(得分:0)
还要考虑您的格式掩码错误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
答案 2 :(得分:0)
如何在查询中为相关列使用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