如何在T-SQL中翻转位字段?

Bil*_*ous 67 sql t-sql sql-server

我正在尝试使用更新查询在SQL Server中翻转一个字段,也就是说,我想将所有0都变为1,反之亦然.什么是最优雅的解决方案?

在T-SQL中似乎没有按位NOT运算符(除非我遗漏了一些明显的东西)并且我无法找到执行更新的任何其他方法.

Aus*_*nen 114

你不需要按位 - 不要为此 - 只需将其与1/true进行异或.

检查一下:

select idColumn, bitFieldY, bitFieldY ^ 1 as Toggled
from tableX
Run Code Online (Sandbox Code Playgroud)

更新:

update tableX
set bitFieldY = bitFieldY ^ 1
where ...
Run Code Online (Sandbox Code Playgroud)

MSDN T-SQL异或(^)

  • 请记住,`bitFieldY ^ 1`将返回一个`int`,所以如果你需要它再次是`bit`,`CAST`或`CONVERT`它将返回'bit`. (2认同)

gbn*_*gbn 48

为什么不简单bitfield = 1 - bitfield

  • 一种巧妙而优雅的方法,特别是对于一次性查询,其中可读性并不重要。 (2认同)

Leo*_*uza 25

另一种方式是

DECLARE @thebit bit = 1, @theflipbit bit

SET @theflipbit = ~ @thebit

SELECT @theflipbit
Run Code Online (Sandbox Code Playgroud)

其中"〜"表示"NOT"运算符.它很干净,你可以得到一个很好的代码来阅读."否定一点"甚至更清洁,它完全符合"NOT"运算符的设计目标.


Tho*_*ens 16

我很确定大多数SQL风格都有一个按位NOT,所以我检查了一下,确实在TSQL中有一个.

从文档中,它是角色~.

  • 来自MyTable的SELECT~MyBitField换句话说,更新MyTable设置MyBitField = ~MyBitField (4认同)

May*_*ayo 12

UPDATE tblTest SET MyBitField = CASE WHEN MyBitField = 1 THEN 0 ELSE 1 END
Run Code Online (Sandbox Code Playgroud)

这很平淡,但每个人都会理解它在做什么.

编辑:

您可能还需要按照注释中的建议考虑空值.当然取决于你的需求.

UPDATE tblTest SET 
   MyBitField = CASE 
      WHEN MyBitField = 1 THEN 0 
      WHEN MyBitField = 0 THEN 1
      ELSE NULL -- or 1 or 0 depending on requirements
   END
Run Code Online (Sandbox Code Playgroud)


Sak*_*pta 8

一个简单的按位NOT运算符(〜)在SQL Server 2014 - 12.0.2269.0中为我工作

在你的T-SQL里面的update子句中 -

        Update TableName
        SET    [bitColumnName] = ~[bitColumnName],
               ....
        WHERE  ....
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

参考 - https://docs.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-not-transact-sql