如何根据Oracle中新旧表中的值创建新列

时间:2014-10-19 12:26:28

标签: sql oracle

以下是我的数据结构

Name    Country
s       India
d       Ind
c       Afric
r       Africa
f       Ind
v       India

国家/地区列中存在许多错误。下面是包含已识别错误的表格

    Old Value   New Value   Source  Column
Ind India   Avox    Country
Afric   Africa  Avox    Country

我需要下表,其中包含Country

的正确值
Name    Country New_Column
s       India   India
d       Ind     India
c       Afric   Africa
r       Africa  Africa
f       Ind     India
v       India   India

以下是我正在使用的命令。这只是数据的快照。我的数据很大

merge into L03_a_AVOX_DATA_test n using (
    SELECT old_value , new_value
      FROM Transformation_Data_all where column_identifier='Country' and Source_identifier='Avox'
) o ON (n.Country = o.old_value)
WHEN MATCHED THEN
  n.New_Column = o.new_value;

3 个答案:

答案 0 :(得分:1)

使用DECODE函数更新所有不正确的列值。或者,为了使其更加明确和可读,请使用CASE construct。

使用DECODE

DECODE(column, 'Ind', 'India', 'Afric', 'Africa')

使用CASE

CASE
   WHEN column = 'Ind'
      THEN 'India'
   WHEN column = 'Afric'
      THEN 'Africa'
END

所以,你的更新语句看起来像是,

UPDATE TABLE_NAME
   SET COUNTRY_NAME = <the decode or case expression as explained above>
 WHERE COUNTRY_NAME IN(country names list);

答案 1 :(得分:0)

“简单”版本:使用两个更新:

update the_table
   set country = 'India'
where country = 'Ind';

update the_table
   set country = 'Africa'
where country = 'Afric;

使用单个语句会更复杂一些

update the_table
   set country = case 
                   when country = 'Afric' then 'Africa'
                   when country = 'Ind' then 'India'
                 end
where country in ('Afric', 'Ind');

答案 2 :(得分:0)

你的问题&#34;实际上并没有这样的问题。也许你想要问的是,当我尝试运行这个MERGE语句时,为什么会出现编译错误?&#34;如果是这样,答案是您需要在MATCHED子句中包含UPDATE关键字。

merge into L03_a_AVOX_DATA_test n 
using (
    SELECT old_value , new_value
      FROM Transformation_Data_all 
      where column_identifier='Country'
    and Source_identifier='Avox'
   ) o 
   ON (n.Country = o.old_value)
WHEN MATCHED THEN
  UPDATE 
  SET  n.New_Column = o.new_value;

如果您需要为所有行填充NEW_COLUMN,正如您的结果集所示,那么您可以在运行合并后通过简单更新来执行此操作。

update 03_a_AVOX_DATA_test n
set n.New_Column = n.Country 
where n.New_Column is null;