Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将值A更改为B,无论它位于哪个列中_Sql_Sql Server - Fatal编程技术网

Sql 将值A更改为B,无论它位于哪个列中

Sql 将值A更改为B,无论它位于哪个列中,sql,sql-server,Sql,Sql Server,单次更新工作: UPDATE users SET email=@newemail WHERE email=@oldemail (1 Zeile(n) betroffen) 双重更新不起作用: UPDATE users SET email=@newemail WHERE email=@oldemail, alternateEmail=@newemail WHERE alternateEmail=@oldEmail Meldung 102, Ebene 15, Status 1, Zeile 1

单次更新工作:

UPDATE users SET email=@newemail WHERE email=@oldemail
(1 Zeile(n) betroffen)
双重更新不起作用:

UPDATE users SET email=@newemail WHERE email=@oldemail, alternateEmail=@newemail WHERE alternateEmail=@oldEmail
Meldung 102, Ebene 15, Status 1, Zeile 1
Incorrect syntax near ','.
在一条语句中如何执行此操作(即使我有N列要检查)

澄清一下:如果我有桌子

email     alternateEmail
a@b.c     d@e.f
d@e.f     a@b.c
我设置了
@oldmail=a@b.c“
@newemail=”g@h.i“
,生成的表应为

email     alternateEmail
g@h.i     d@e.f
d@e.f     g@h.i
我知道我可以用两个(或N个)语句来完成:

UPDATE users SET email=@newemail WHERE email=@oldemail
UPDATE users SET alternateEmail=@newemail WHERE alternateEmail=@oldEmail

但是我可以用一句话来表达吗?

你可以这样做:

UPDATE users SET 
    email = case 
               when email = @oldemail then @newemail 
               else email 
            end,
    alternateEmail = case 
                       when alternateEmail = @oldemail then @newemail 
                       else alternateEmail 
                     end
where 
    email = @oldemail 
    or alternateEmail = @oldemail

您可以这样做:

UPDATE users SET 
    email = case 
               when email = @oldemail then @newemail 
               else email 
            end,
    alternateEmail = case 
                       when alternateEmail = @oldemail then @newemail 
                       else alternateEmail 
                     end
where 
    email = @oldemail 
    or alternateEmail = @oldemail

通常,如果在多个列中存储相同的“类型”数据,则这是数据模型损坏的标志。更好的设计是将电子邮件移出到一个单独的表中,该表可以包含所需的任意多行和一个额外的列,以指示(例如)每个电子邮件的优先级(如标准、备用等)。通常,如果在多个列中存储了相同的“种类”数据,则表示数据模型已损坏。更好的设计是将电子邮件移出到一个单独的表中,该表可以包含所需的任意多行,并增加一列以指示(例如)每封电子邮件的优先级(例如,标准、备用等),但实际上不会更改值的更新是否会最终被记录并增加事务大小?我想知道查询是否也应该有WHERE子句来限制update语句实际运行的行。@LasseV.Karlsen请注意,谢谢。错过了where条件。实际上不会更改值的更新是否会被记录并增加事务大小?我想知道查询是否也应该有WHERE子句来限制update语句实际运行的行。@LasseV.Karlsen请注意,谢谢。错过了哪里的条件。