【问题标题】:How do I switch column values from 0 to 1 and vice versa using the update statement?如何使用更新语句将列值从 0 切换到 1,反之亦然?
【发布时间】:2012-04-29 03:52:18
【问题描述】:

我有一张表Table1如下

col1 col2
---- ----
 A    1
 B    1
 C    1
 D    0
 E    0
 F    0

我希望结果表应该如下(使用Update语句)

col1 col2
---- ----
 A    0
 B    0
 C    0
 D    1
 E    1
 F    1

【问题讨论】:

  • 取决于第二列的值,如果它是 0,那么它应该用 1 更新,如果它是 1,那么它应该用 0 更新。我尝试了 update 和 case 但它不起作用。跨度>

标签: sql sql-server tsql sql-server-2005


【解决方案1】:

脚本 1:Demo at SQL Fiddle

UPDATE dbo.Table1 SET col2 = (CASE col2 WHEN 1 THEN 0 ELSE 1 END);

脚本 2:如果值始终为 0 或 1,则可以使用 按位异或运算符。 Demo at SQL Fiddle

UPDATE dbo.Table1 SET col2 = (col2 ^ 1);

【讨论】:

  • 在一个人为的测试中,在一张巨大的桌子上,你的 Script 2 比我的尝试快一点。不确定我们是否可以改进这一点。干得好!
  • 不是 OP 想要的,但万一有人用谷歌搜索这个。这在检查字符串时也有效: UPDATE dbo.Table1 SET col1 = (CASE col1 WHEN 'A' THEN 'B' WHEN 'B' THEN 'A' ELSE col1 END);
【解决方案2】:

既然你提到你正在使用 INT,那么:

update dbo.Table1 set col2 = 1 - col2;

【讨论】:

  • 这个简单而精彩
【解决方案3】:

我确信有一种更优雅的方式,但这应该可行:

UPDATE Table1
SET col2 = CASE col2 WHEN 0 THEN 1 WHEN 1 THEN 0 ELSE col2 END

【讨论】:

  • 优秀...它工作正常。非常感谢您的快速帮助。 :)
【解决方案4】:

如果您在 SQL Server 上使用正确的布尔值 (BIT),则可以使用:http://sqlfiddle.com/#!6/0ed3c/1

UPDATE dbo.Table1 SET col2 = ~col2;

【讨论】:

  • 只是吹毛求疵,BIT 与 BOOLEAN 不同。 SQL Server 中没有 BOOLEAN 类型。
  • 是的,SQL Server 没有布尔值,这就是为什么这不起作用SELECT * FROM Assets WHERE IsInsured。 SQL Server 的 BIT 虽然不是其他数据库(例如 PostgreSQL)的一流布尔值。 SQL Server 的布尔值不存在,因为它在 Fortran 上。 BIT 由 SQL Server 团队引入,用于布尔值。但出于所有意图和目的,SQL Server 的 BIT 在每一位都是布尔值。实体框架和许多 ORM 也尊重这一点:stackoverflow.com/questions/1446054/…
【解决方案5】:

非常简单的查询

update table set col= (col-1)* -1;

解释:

  • 0 的情况:

    update table set col= (0-1)* -1; // return 1;
    
  • 1 例:

    update table set col= (1-1)* -1; // return 0;
    

【讨论】:

    【解决方案6】:

    你可以这样做:

    UPDATE table SET col = 1-col
    

    【讨论】:

    • 请解释一下代码的作用和它是怎么做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多