我有一个表 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;
现在我收到以下错误:
如何正确更新?我使用oracle 12C数据库
答案 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')