Oracle SQL我的输入应该是to#char(:n,';fm000';)中的格式掩码

Oracle SQL我的输入应该是to#char(:n,';fm000';)中的格式掩码,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,如果我的字符串长度超过4位,则我的输出显示为####### 为此,查询为: select to_char(:n,'fm0000') from dual; 它应该根据输入绑定变量fm后的长度取零的数量 输入:123 产出:0123 输入:123456789 输出:0123456789 零应该在输入数之前 任何建议 根据 如果省略fmt,则n将转换为正好长的VARCHAR2值 足够容纳它的有效数字 因此,也许您所需要的只是根据 如果省略fmt,则n将转换为正好长的VARCHAR2值 足够容纳它的

如果我的字符串长度超过4位,则我的输出显示为#######

为此,查询为:

select to_char(:n,'fm0000') from dual;
它应该根据输入绑定变量fm后的长度取零的数量

输入:123 产出:0123

输入:123456789 输出:0123456789

零应该在输入数之前


任何建议

根据

如果省略fmt,则n将转换为正好长的VARCHAR2值 足够容纳它的有效数字

因此,也许您所需要的只是根据

如果省略fmt,则n将转换为正好长的VARCHAR2值 足够容纳它的有效数字


因此,您可能只需要
编辑字符(:n)

编辑——OP完全改变了需求

已编辑问题的解决方案很简单:

... '0' || to_char(:n)
编辑结束-以下原始答案(对最初发布的问题)

看来你想做的事情最好是这样实现的。不要介意
with
子句,它只用于测试。根据需要进行调整,并在格式模型中使用足够多的9来覆盖最长的输入

with
     test_data ( n ) as (
       select 3     from dual union all
       select 19923 from dual
     )
select n, to_char(n, 'fm99990000') as n_str
from   test_data
;

     N N_STR
------ --------
     3 0003
 19923 19923

2 rows selected.

编辑-OP完全改变了要求

已编辑问题的解决方案很简单:

... '0' || to_char(:n)
编辑结束-以下原始答案(对最初发布的问题)

看来你想做的事情最好是这样实现的。不要介意
with
子句,它只用于测试。根据需要进行调整,并在格式模型中使用足够多的9来覆盖最长的输入

with
     test_data ( n ) as (
       select 3     from dual union all
       select 19923 from dual
     )
select n, to_char(n, 'fm99990000') as n_str
from   test_data
;

     N N_STR
------ --------
     3 0003
 19923 19923

2 rows selected.

根据您更新的需求,只需稍微修改@mathguy的原始格式掩码操作即可完成此操作;或者使用默认的字符串转换和左填充,或者更简单地只在单个零前加上前缀:

with t (n) as (
  select 1 from dual
  union all select 123 from dual
  union all select 123456789 from dual
)
select n,
  to_char(n, 'fm' || rpad('0', length(n) + 1, '0')) as n_str_1,
  lpad(to_char(n), length(n) + 1, '0') as n_str_2,
  '0' || to_char(n) as n_str_3
from t;

         N N_STR_1    N_STR_2    N_STR_3   
---------- ---------- ---------- ----------
         1 01         01         01        
       123 0123       0123       0123      
 123456789 0123456789 0123456789 0123456789

根据您更新的需求,只需稍微修改@mathguy的原始格式掩码操作即可完成此操作;或者使用默认的字符串转换和左填充,或者更简单地只在单个零前加上前缀:

with t (n) as (
  select 1 from dual
  union all select 123 from dual
  union all select 123456789 from dual
)
select n,
  to_char(n, 'fm' || rpad('0', length(n) + 1, '0')) as n_str_1,
  lpad(to_char(n), length(n) + 1, '0') as n_str_2,
  '0' || to_char(n) as n_str_3
from t;

         N N_STR_1    N_STR_2    N_STR_3   
---------- ---------- ---------- ----------
         1 01         01         01        
       123 0123       0123       0123      
 123456789 0123456789 0123456789 0123456789


格式掩码的意义是什么?如果值小于四位数,则需要前导零,但如果值大于四位数,则不需要前导零。基本上,我之所以需要前导零,是因为如果输入为123,则我的输出应为0123如果输入为123456789,输出为0123456789,则前导零应在前导零之前。您始终希望在值的前面附加一个零?如果它只是1呢?它应该显示为01还是0001?它应该只显示为01。@AkshayBhan-你意识到这与你最初的要求有很大的不同吗?你现在的问题要简单得多,为什么不直接用
'0'| to_char(:n)
?在左边连接一个零。格式掩码的作用是什么?如果值小于四位数,则需要前导零,但如果值大于四位数,则不需要前导零。基本上,我之所以需要前导零,是因为如果输入为123,则我的输出应为0123如果输入为123456789,输出为0123456789,则前导零应在前导零之前。您始终希望在值的前面附加一个零?如果它只是1呢?它应该显示为01还是0001?它应该只显示为01。@AkshayBhan-你意识到这与你最初的要求有很大的不同吗?你现在的问题要简单得多,为什么不直接用
'0'| to_char(:n)
?将一个零连接到左边。而不是使用_NUMBER(:n)@GauravSoni-为什么-OP将数字格式化为字符串以供显示,而不是将字符串转换为数字?@AlexPoole:如果是用于显示,那么me@GauravSoni-Alex可能是对的-OP似乎想将3显示为“0003”,300为'0300',13391为'13391'。输入:123输出:0123输入:123456789输出:0123456789而不是使用数字(:n)@GauravSoni-为什么-OP正在将数字格式化为字符串以供显示,不将字符串转换为数字?@AlexPoole:如果是为了显示,那么me@GauravSoni-Alex可能是对的-OP似乎希望将3显示为“0003”,300显示为“0300”,但13391显示为“13391”。输入:123输出:0123输入:123456789输出:0123456789