SQL使用不同的值更新多行,这些行与列表中的值匹配

SQL使用不同的值更新多行,这些行与列表中的值匹配,sql,sql-update,Sql,Sql Update,所以这个标题可能有点混乱。如果你能建议更好的措辞,请让我知道,我会更新 问题就在这里。我有一个包含数千行的表,我需要更新其中的几千行来存储最新的电子邮件数据 例如: OldEmail@1.com => NewEmail@1.com OldEmail@2.com => NewEmail@2.com 我有一份旧邮件的清单OldEmail@1.com','OldEmail@2.com'和新的列表'NewEmail@1.com','NewEmail@2.com'. 我们的希望是简单地用类似 UPDATE

所以这个标题可能有点混乱。如果你能建议更好的措辞,请让我知道,我会更新

问题就在这里。我有一个包含数千行的表,我需要更新其中的几千行来存储最新的电子邮件数据

例如:

OldEmail@1.com => NewEmail@1.com

OldEmail@2.com => NewEmail@2.com

我有一份旧邮件的清单OldEmail@1.com','OldEmail@2.com'和新的列表'NewEmail@1.com','NewEmail@2.com'. 我们的希望是简单地用类似

UPDATE Table 
SET Email = ('NewEmail@1.com','NewEmail@2.com')
WHERE Email = ('OldEmail@1.com','OldEmail@2.com')
我希望这是有道理的。有问题尽管问。谢谢

您可以使用大小写表达式:

update mytable
set email = case email
    when 'OldEmail@1.com' then 'NewEmail@1.com'
    when 'OldEmail@2.com' then 'NewEmail@2.com'
end
where email in ('OldEmail@1.com','OldEmail@2.com')
或者更好的是,如果您有一个大的值列表,您可以创建一个表来存储它们,如myrefold_email、new_email,并将其加入到更新查询中,如下所示:

update t
set t.email = r.new_email
from mytable t
inner join myref r on r.old_email = t.email

update/join的实际语法在不同的数据库中有所不同-上述SQL Server语法。

准确地说,在特定的DBMS中,语法是:

WITH cte AS (SELECT 'NewEmail@1.com' newvalue, 'OldEmail@1.com' oldvalue
             UNION ALL
             SELECT 'NewEmail@2.com', 'OldEmail@2.com')
UPDATE table
SET table.email = cte.newvalue
FROM cte
WHERE table.email = cte.oldvalue
或者,如果CTE不可用

UPDATE table
SET table.email = cte.newvalue
FROM (SELECT 'NewEmail@1.com' newvalue, 'OldEmail@1.com' oldvalue
      UNION ALL
      SELECT 'NewEmail@2.com', 'OldEmail@2.com') cte
WHERE table.email = cte.oldvalue

用你正在使用的数据库标记你的问题。将映射列表放在一个单独的表中。然后执行更新tablename SET email=coalesceselect maxnewmail from mappingtable,其中oldmail=email,email将您的pairs值,替换为CTE/subquery中的表格形式,或保存在临时或静态表格中,然后按常规方式更新。这确实有点道理,但问题是我实际上有数千行要更新,因此为每行编写一个案例将是一项非常耗时的任务:/啊,是的。看来这可能是个好办法!我来试一试:这在GMB上运行得很好。谢谢你。感谢其他人提供的建议: