您发现系统中的一个错误将数据库中的男性 (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)
在 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)
为了在两个值之间切换,您也可以尝试这个技巧,它不使用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)
根据 的当前值Gender,ASCII(Gender)将取消ASCII('M')或ASCII('W'),留下由CHAR()函数转换回相应字符的其他代码。
不过,我留下这个只是为了比较。虽然这个选项可能看起来很优雅,但使用CASE表达式的解决方案可以说更具可读性,因此更容易维护,并且肯定会更容易扩展到两个以上的值。