5

我有一个 oracle 列(artnr)包含长度为 1 的数字(9)类型。我想按以下方式更新号码...

例子 :

如果数字为 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 解决方案更可取

4

4 回答 4

10

如果数字为 0,则应为 00000 如果数字为 1,则应为 00001 如果数字为 12,则应为 00012

请记住:这里的 00000,0000 和 00012 是数字数据类型

首先,数字没有前导零。因此,当您存储 NUMBER 值时,您可以让它们表现得像 NUMBER。只有当您想要显示它们时,您才能使用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

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

于 2014-09-22T07:58:14.187 回答
5
select to_char(x,'00000') from dual;
于 2014-09-22T14:32:43.570 回答
1

If you really want to store those numbers with preceeding zeroes then you must change the datatype to varchar2. Then you can apply to_char( artnr , 'fm00009') in the update statement. Of course, this might come with unintended consequences. Go for this solution at your own risk.

You might also consider creating a view that zero-paddes the number "on the fly" when you select from that view.

于 2014-09-22T08:11:01.380 回答
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;
于 2017-05-18T08:47:05.747 回答