在mysql命令行中反转列值

时间:2010-03-28 20:37:20

标签: mysql sql sql-update

我有一个表posts,其列为published,其为0(未发布)或1(已发布)。 假设我想将所有已发布的帖子发布到未发布的帖子中,将所有未发布的帖子发布到已发布的帖子中。 我知道正在运行

UPDATE posts SET published = '1' WHERE published = '0';
UPDATE posts SET published = '0' WHERE published = '1';

最终会将我的所有帖子都转到已发布的帖子中。 我如何在mysql命令行中运行这些查询,以便它真正“反转”值,而不是上面提到的错误?

由于

编辑:假设数据类型是字符串。我知道ints / bools是一个更好的方法,但我正在使用字符串,并且不能改变模式。

4 个答案:

答案 0 :(得分:2)

如果这看起来真的很难,你就没有考虑过它了。

UPDATE posts SET published = 1 - published;

应该这样做,或者其他一些解决方案(例如使用XOR或CASE)。

答案 1 :(得分:2)

对于字符串 - 您可以使用SET子句中的任何表达式。

UPDATE posts SET published = IF(published = "1", "0", "1");

CASE版,感谢OMG小马:

UPDATE posts SET published = CASE published WHEN "1" THEN "0" ELSE "1" END;

在两个版本中,如果发布了IS NULL,它将设置为“1”,因为与NULL的任何比较都是false。

答案 2 :(得分:2)

使用:

UPDATE posts
   SET published = CASE 
                     WHEN published IS NULL THEN NULL
                     WHEN published = '1' THEN '0'
                     ELSE '1' 
                   END

答案 3 :(得分:0)

你们怎么看待这个:

UPDATE posts SET published = 'A1' WHERE published = 'A';
UPDATE posts SET published = 'B' WHERE published = 'A';
UPDATE posts SET published = 'A' WHERE published = 'A1';

编辑:这不是远程正确的