【问题标题】:How to add leading zero in a number in Oracle SQL query?如何在 Oracle SQL 查询中的数字中添加前导零?
【发布时间】:2015-10-20 00:36:05
【问题描述】:

我正在使用 COUNT() 函数在查询中检索名为removing_count 的列。在结果集中,removing_count 的数据类型是 BIGDECIMAL。我想将数字转换为五位数。所以如果值小于五位,那么它应该用前导零表示。

例如 1) 如果删除计数为 540,则显示 00540
2) 如果删除计数为 60,则显示 00060

如果删除计数是整数/字符串值,那么我可以使用 java 表达式添加前导零:

--if removal_count is integer--
String.format("%05d",removal_count)

--if removal_count is string--
("00000"+removal_count).subString(removal_count.length())

我们可以将removing_count 转换为字符串或整数(从大十进制),以便我可以使用给定的java 表达式吗?或者有没有办法在查询本身中添加前导零?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    你可以通过两种方式做到这一点。

    方法一

    使用 LPAD

    例如,

    SQL> WITH DATA(num) AS(
      2  SELECT 540 FROM dual UNION ALL
      3  SELECT 60 FROM dual UNION ALL
      4  SELECT 2 FROM dual
      5  )
      6  SELECT num, lpad(num, 5, '0') num_pad FROM DATA;
    
           NUM NUM_P
    ---------- -----
           540 00540
            60 00060
             2 00002
    
    SQL>
    

    WITH 子句只是为演示构建示例数据,在您的实际查询中只需这样做:

    lpad(removal_count, 5, '0')
    

    请记住,数字不能有前导零。上述查询的输出是 string 而不是 number

    方法二

    使用 TO_CHAR 和格式模型:

    SQL> WITH DATA(num) AS(
      2  SELECT 540 FROM dual UNION ALL
      3  SELECT 60 FROM dual UNION ALL
      4  SELECT 2 FROM dual
      5  )
      6  SELECT num, to_char(num, '00000') num_pad FROM DATA;
    
           NUM NUM_PA
    ---------- ------
           540  00540
            60  00060
             2  00002
    
    SQL>
    

    更新:为避免用于减号的额外前导空格,请使用TO_CHAR 格式的FM

    没有 FM:

    SELECT TO_CHAR(1, '00000') num_pad,
      LENGTH(TO_CHAR(1, '00000')) tot_len
    FROM dual;
    
    NUM_PAD    TOT_LEN
    ------- ----------
     00001           6 
    

    带调频:

    SELECT TO_CHAR(1, 'FM00000') num_pad,
      LENGTH(TO_CHAR(1, 'FM00000')) tot_len
    FROM dual;
    
    NUM_PAD    TOT_LEN
    ------- ----------
    00001            5
    

    【讨论】:

    • 这种类型的问题已经在 stackoverflow 上回答了 How to display theleading zero's in a number of oracle
    • 嗨@Lalit,小修正。方法 1 仅限于正数。方法 2 适用于负数,但对于正数会为缺失符号生成前导空白。知道如何摆脱它(除了使用 substr)吗?
    • @MarmiteBomber 我验证了第二种方法,我发现它适用于带有 + 和 - 符号的正数和负数。检查输出的长度是否相同。
    • @LalitKumarB 这里是一个例子:SELECT lpad(-1, 5, '0') m1, length(to_char(1, '00000')) m2 num_pad FROM dual;。方法一给出000-1。方法一对 + 和 - 都适用;我经常遇到的问题是正数的前导空白(用长度 6 表示)。最好有 unsigned interger 的解决方案,总是给出长度 5。
    【解决方案2】:

    使用LPAD pl/sql 函数http://www.techonthenet.com/oracle/functions/lpad.php

    removal_count = 540 
    LPAD(TO_CHAR(removal_count), 5, '0');
    Result: '00540'
    

    【讨论】:

      【解决方案3】:

      在 sqlplus 中可以使用 col 格式:

      SQL> select 540 aa, 540 bb from dual ;

          AA         BB
      

         540        540
      

      SQL> col bb 格式 00000

      SQL> /

          AA     BB
      

         540  00540
      

      SQL>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-12
        • 2015-05-14
        相关资源
        最近更新 更多