Answers:
您要使用CASE
某种类型的表达式。
在SQL Server中,代码如下所示:
UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W'
WHEN gender = 'W' THEN 'M'
ELSE gender END
编辑: 如注释(和一些其他答案)中所述,如果在语句上放置WHERE子句,则ELSE不是必需的。
UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W'
WHEN gender = 'W' THEN 'M' END
WHERE gender IN ('M','W')
这样可以避免不必要的更新。无论哪种情况,重要的是要记住,除了M&W(例如NULL)以外,还有其他选项,并且您不想输入错误的信息。例如:
UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W'
ELSE 'M' END
这会将所有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' );
更简洁
/*For SQL Server 2012+*/
UPDATE TableName
SET gender = IIF(gender = 'M', 'W', 'M')
WHERE gender IN ( 'M', 'W' );
IIF()
,IF()
它将在MySQL中工作;)
为了仅在两个值之间切换,您还可以尝试以下技巧,该技巧不使用CASE
表达式(此处假设Transact-SQL):
UPDATE
YourTable
SET
Gender = CHAR(ASCII('M') + ASCII('W') - ASCII(Gender))
WHERE
Gender IN ('M', 'W')
;
根据的当前值Gender
,ASCII(Gender)
将取消ASCII('M')
或ASCII('W')
,从而使该CHAR()
函数要转换的其他代码返回到相应的字符。
不过,我将其留作比较。尽管此选项可能带有高雅的外观,但是使用CASE
表达式的解决方案可以说更具可读性,因此更易于维护,并且肯定会更容易扩展为两个以上的值。
M
和W
都以大写形式输入,以避免7
结果中出现意外或`-`的情况。
ASCII(Gender)
用ASCII(UPPER(Gender))
,这是那么优雅,但并不多。
WHERE
子句拒绝吗?
您可以使用case ... when
表达式来做到这一点:
mysql> select * from genderswap;
+--------+
| gender |
+--------+
| F |
| F |
| M |
| M |
| M |
| M |
| M |
+--------+
7 rows in set (0.00 sec)
mysql>
mysql> UPDATE genderswap SET gender = case
-> when gender='M' then 'F'
-> when gender='F' then 'M'
-> end
-> WHERE gender IN ('M', 'F');
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7 Changed: 7 Warnings: 0
mysql>
mysql> select * from genderswap;
+--------+
| gender |
+--------+
| M |
| M |
| F |
| F |
| F |
| F |
| F |
+--------+
7 rows in set (0.00 sec)
mysql>
我将使用带有case
表达式的更新。
DECLARE @Test TABLE
(
Name VARCHAR(100) NULL
, Gender CHAR(1) NULL
);
INSERT INTO @Test
( Name, Gender )
VALUES ( 'Jonathan', 'W' )
,
( 'Kelly', 'M' );
SELECT Name
, Gender
FROM @Test;
UPDATE @Test
SET Gender = CASE WHEN Gender = 'M' THEN 'W'
ELSE 'M'
END;
SELECT Name
, Gender
FROM @Test;