01722. 00000 - "无效数字" /如何正确更新行?

时间:2016-06-13 10:47:24

标签: sql oracle12c

我有一个表 foo ,其中colum C1 的类型为 smallint 。此表包含值 1 2 C1

现在我已将 C1的类型从smallint更改为VARCHAR2

我必须使用以下逻辑更新表:

对于C1 = 1 C1的每一行,

现在应为A

对于C1 = 2 C1的每一行,

现在应该是B

我使用以下语句进行更新:

update foo 
SET C1 = 'A' 
WHERE C1 =0; 

update foo 
SET C1 = 'B' 
WHERE C1 =1; 

commit;

现在我收到以下错误:

  1. 00000 - "无效的号码"
  2. 如何正确更新?我使用oracle 12C数据库

2 个答案:

答案 0 :(得分:3)

将值更改为字符串后,应使用字符串进行比较。所以试试这个版本:

update foo 
SET C1 = 'A' 
WHERE C1 = '0'; 

update foo 
SET C1 = 'B' 
WHERE C1 = '1'; 

commit;

我认为where子句导致错误,因为第一次更新中的'A'值无法转换为数字。

或者,您可以这样做:

update foo
    set c1 = (case when c1 = '0' then 'A' else 'B' end)
    where c1 in ('0', '1');

commit;

答案 1 :(得分:2)

嗯,首先必须更改列类型。 如果你已经这样做了,可能是因为缺少引号',字符串应该用单引号括起来:

ALTER TABLE foo 
  MODIFY C1 varchar2(2);

update foo 
SET C1 = CASE WHEN C1 = '0' THEN 'A' 
              WHEN C1 = '1' THEN 'B'
         END

如您所见,我使用CASE EXPRESSION将您的两个查询合并为一个,不需要两个不同的更新。如果可能有两个C1选项,请使用WHERE子句:

update foo 
SET C1 = CASE WHEN C1 = '0' THEN 'A' 
              WHEN C1 = '1' THEN 'B'
         END
WHERE C1 IN('0','1')