Oracle SQL我的输入应该是to#char(:n,';fm000';)中的格式掩码
如果我的字符串长度超过4位,则我的输出显示为####### 为此,查询为: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值 足够容纳它的
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