使用一条更新语句切换列中的值

Set*_*Yes 17 update

您发现系统中的一个错误将数据库中的男性 (M) 错误地命名为女性 (W),反之亦然。列只允许一个字符。在不使用任何临时表的情况下,编写一个更新查询来解决这个问题。

这个问题是在我最近的一次采访中被问到的,我将参加更多可能有类似问题的采访,所以我想知道如何处理这个问题。

Ken*_*her 28

您想使用CASE某种类型的表达式。

在 SQL Server 中,代码如下所示:

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M'
                  ELSE gender END
Run Code Online (Sandbox Code Playgroud)

编辑: 如评论(以及其他一些答案)中所述,如果您在语句上放置 WHERE 子句,则不需要 ELSE。

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M' END
WHERE gender IN ('M','W')
Run Code Online (Sandbox Code Playgroud)

这避免了不必要的更新。在任何一种情况下,重要的是要记住除了 M & W 之外还有其他选项(例如 NULL),并且您不想输入错误的信息。例如:

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  ELSE 'M' END
Run Code Online (Sandbox Code Playgroud)

这会将任何 NULL(或其他可能的性别)替换为不正确的“M”。


其他几个选项是

/*Simple form of CASE rather than Searched form*/
UPDATE TableName
SET    gender = CASE gender
                  WHEN 'M' THEN 'W'
                  WHEN 'W' THEN 'M'
                END
WHERE  gender IN ( 'M', 'W' );
Run Code Online (Sandbox Code Playgroud)

还有更简洁的

/*For SQL Server 2012+*/
UPDATE TableName
SET    gender = IIF(gender = 'M', 'W', 'M')
WHERE  gender IN ( 'M', 'W' ); 
Run Code Online (Sandbox Code Playgroud)


Lei*_*fel 9

在 Oracle 中,您可以使用 CASE 作为其他答案:

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M'
             END
WHERE gender in ('M','W');
Run Code Online (Sandbox Code Playgroud)

您还可以使用解码器:

UPDATE TableName SET gender = DECODE(gender,'M','W','W','M')
WHERE gender in ('M','W');
Run Code Online (Sandbox Code Playgroud)


And*_*y M 6

为了在两个值之间切换,您也可以尝试这个技巧,它不使用CASE表达式(假设这里是 Transact-SQL):

UPDATE
  YourTable
SET
  Gender = CHAR(ASCII('M') + ASCII('W') - ASCII(Gender))
WHERE
  Gender IN ('M', 'W')
;
Run Code Online (Sandbox Code Playgroud)

根据 的当前值GenderASCII(Gender)将取消ASCII('M')ASCII('W'),留下由CHAR()函数转换回相应字符的其他代码。

不过,我留下这个只是为了比较。虽然这个选项可能看起来很优雅,但使用CASE表达式的解决方案可以说更具可读性,因此更容易维护,并且肯定会更容易扩展到两个以上的值。

  • 让我们希望所有的“M”和“W”都以大写形式输入,以避免在结果中出现意外的“7”或“-”。 (3认同)