以下是我的数据结构
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;
答案 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;