【问题标题】:Oracle SQL My input should be the format mask in to_char(:n,'fm000')Oracle SQL 我的输入应该是 to_char(:n,'fm000') 中的格式掩码
【发布时间】:2017-01-31 14:48:15
【问题描述】:

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

为此,查询是:

select to_char(:n,'fm0000') from dual;

它应该根据fm之后的输入绑定变量长度取零的数量。

输入:123 输出:0123

输入:123456789 输出:0123456789

零应该在输入的数量之前。


任何建议!!

【问题讨论】:

  • 格式掩码的意义何在?如果值小于四位数,您需要前导零,但如果它更长,则不需要?
  • 基本上我需要它的原因是如果我输入 123 我的输出应该是 0123 如果输入:123456789 输出:0123456789 之前应该是零
  • 您总是希望在值的前面附加一个零?如果它只是 1 怎么办 - 它应该显示为 01 还是 0001?
  • 应该只显示为01。
  • @AkshayBhan - 你意识到这与你最​​初问的完全不同吗?你现在问的要容易得多,为什么不直接使用'0' || to_char(:n)?在左侧连接一个零。

标签: sql oracle oracle11g


【解决方案1】:

编辑 - 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.

【讨论】:

    【解决方案2】:

    根据documentation

    如果您省略 fmt,则 n 将转换为 VARCHAR2 值,长度正好 足以容纳其有效数字

    所以也许你只需要to_char(:n)

    【讨论】:

    • 宁可使用 TO_NUMBER(:n)
    • @GauravSoni - 为什么 - OP 将数字格式化为字符串以供显示,而不是将字符串转换为数字?
    • @AlexPoole:如果是为了展示,那对我来说很有意义
    • @GauravSoni - 亚历克斯可能是对的 - 似乎 OP 想将 3 显示为“0003”,将 300 显示为“0300”,但将 13391 显示为“13391”。
    • 输入:123 输出:0123 输入:123456789 输出:0123456789
    【解决方案3】:

    根据您更新的要求,您可以对@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
    

    【讨论】:

      【解决方案4】:

      如果您要检查的字段是字符串:

      case when substring(field, 1, 1)!=0 then '0'||field else field end
      

      如果是数字,您可以随时按照其他人的建议添加 0:

      '0'||to_char(field)
      

      【讨论】:

        猜你喜欢
        • 2021-07-22
        • 2021-05-13
        • 2014-03-01
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        相关资源
        最近更新 更多