如何使用新值更新表中的记录列表,具体取决于旧值

时间:2015-06-15 12:18:58

标签: sql-server sql-update

我有一个名为acc1152的表,字段为accno。取决于该字段的值,我需要用新值替换它。这些是我需要更新的值

old value   new value
  7007        4007
  7008        4008
  4008        7
  7009        4009
  7011        4011
  4011        ' '
  7010        4010
  4010        1
  7016        4016
  4016        1
  4506        4006
  4512        4012

如果记录在其accno字段中具有上述旧值,则该accno需要替换为新值

如何编写一个可以完成此任务的查询?

2 个答案:

答案 0 :(得分:5)

您可以在更新语句中使用case语句,如下所示:

update acc1152
set [columnName] = 
    case [columnName]
        when '7007' then '4007'
        when '7008' then '4008'
        -- etc
        when '4512' then '4012'
    else
        [columnName] end

或者更好的方法(IMO)是使用临时/变量表来跟踪旧/新映射

declare @someTable table (oldValue varchar(50), newValue varchar(50))
insert into @someTable (oldValue, newValue)
select '7007','4007'
union all select '7008','4008'
-- etc
union all select '4512','4012'

update acc1152
set [columnName] = st.newValue
from acc1152 a
inner join @someTable st on a.[columnName] = st.oldValue

答案 1 :(得分:2)

以下内容适用于任何数据库(它是ANSI标准SQL):

update acc1152 t
    set accno = (select r.newvalue from replacements r where r.oldvalue = t. acc1152)
    where exists (select 1 from replacements where r.oldvalue = t. acc1152);

根据数据库的不同,还有其他方法。

这假设您的替换值在表格中,我称之为replacements