我有一个oracle列(artnr)包含长度为1的类型为number(9)。我想更新数字如下......
示例:
如果number为0则应为00000 如果number为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解决方案更受欢迎
答案 0 :(得分:9)
如果number为0,那么它应该是00000如果number是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
。
答案 1 :(得分:5)
select to_char(x,'00000') from dual;
答案 2 :(得分:0)
如果确实想要存储前面为零的数字,则必须将数据类型更改为varchar2。然后,您可以在更新语句中应用to_char( artnr , 'fm00009')
。当然,这可能带来意想不到的后果。寻求此解决方案需要您自担风险。
您可能还会考虑创建一个视图,当您从该视图中进行选择时,该视图会“动态”对数字进行零填充。
答案 3 :(得分:0)
在我的情况下,目标是计算不同货币的值的总和,但问题是由字段VALUE的数据类型创建的,即VARCHAR2(255 BYTE)。我找到了这个解决方案,用于处理前导零的问题:
{{1}}