如何在Oracle中显示数字的前导零

5
我有一个包含长度为1,数据类型为数字(9)的Oracle列(artnr)。 我想将数字更新为以下内容...。
例如: 如果数字为0,则应为00000 如果数字为1,则应为00001 如果数字为12,则应为00012
请记住:这里的00000、0000和00012是数字数据类型。
我尝试过以下方法,但未成功...。
UPDATE pitb.toestel b
   SET b.artnr = LPAD (b.artnr, 5, 0)
 WHERE b.idinventaris = 403743;

由于Lpad只能应用于字符串,因此出现了失败

UPDATE pitb.toestel b
   SET b.artnr = TO_NUMBER (TO_CHAR (artnr, '00009'), '00009')
 WHERE b.idinventaris = 403743;

仍然失败了,因为to_number不会显示前导零。它只会从第一个数字开始考虑。

请问有人能提供解决这种情况的建议吗?

使用SQL优于PL/SQL解决方案。


1
一个数字不能有前导0,它会被视为字符,因此请在你的最后一条语句中去掉TO_NUMBER() - Ben
1
当列的数据类型为“数字”时,前导零将不会被存储。请将值存储为数字,并在显示数据时使用lpad()(使用to_char()避免隐式数据类型转换)或直接使用to_char() - Nick Krasnov
4个回答

10
首先,数字不应该有前导零。因此,当您存储数字值时,应让它们像数字一样运作。只有在显示它们时,您可以使用LPAD并添加前导零。这将将数字转换为带有前导零的字符串。
因此,无需更新表格。使用LPAD以所需方式显示它们即可。
 SQL> WITH DATA AS
  2    ( SELECT 1 ID FROM DUAL UNION ALL
  3      SELECT 11 ID FROM DUAL
  4    )
  5  SELECT
  6     LPAD(ID,5, 0) id
  7  FROM DATA
  8  /

ID
-----
00001
00011
为避免隐式数据类型转换,在应用 LPAD 之前,请使用 TO_CHAR

5
select to_char(x,'00000') from dual;

1
如果你真的想要存储那些带有前导零的数字,那么你必须将数据类型更改为varchar2。然后在更新语句中可以应用to_char( artnr , 'fm00009')。当然,这可能会带来意想不到的后果。使用此解决方案需自担风险。
你还可以考虑创建一个视图,在从该视图选择时"即时"零填充该数字。

0
在我的情况下,目标是计算不同货币的价值总和,但问题是由字段VALUE的数据类型VARCHAR2(255 BYTE)引起的。我已经找到了解决方案,以处理前导零的问题:
    SELECT ID_OUT
          , CASE WHEN REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.') LIKE '-.%' THEN REPLACE(REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.'), '-.', '-0.')
                 WHEN REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.') LIKE '.%' THEN REPLACE(REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.'), '.', '0.')
                 ELSE REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.') 
            END AS VALORE
         , LOB
         , 'TOTAL' CURRENCY
         , COUNTRY
    FROM QRT_OUT_DATI
    WHERE (CURRENCY != 'Total' AND CURRENCY != 'TOTAL')
    GROUP BY ID_OUT, LOB, COUNTRY, CURRENCY 
    ORDER BY LOB;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接