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

我试图在 SQLServer 中使用一个更新查询来翻转一个位字段,也就是说,我想把所有的0变成1,反之亦然。最优雅的解决方案是什么?

在 T-SQL 中似乎没有按位 NOT 操作符(除非我遗漏了一些显而易见的东西) ,而且我也没能找到其他执行更新的方法。

42009 次浏览

我非常确定大多数 SQL 风格都有一个按位不,所以我检查了一下,那里有 似乎是一个在 TSQL

从文档来看,它是字符 ~

您不需要按位-不是为了这个-只需要用1/true 来 XOR 它。

检查一下:

select idColumn, bitFieldY, bitFieldY ^ 1 as Toggled
from tableX

更新:

update tableX
set bitFieldY = bitFieldY ^ 1
where ...

独占或(^)

UPDATE tblTest SET MyBitField = CASE WHEN MyBitField = 1 THEN 0 ELSE 1 END

虽然平淡无奇,但是每个人都能理解它在做什么。

编辑:

您可能还需要考虑评论中建议的 null。当然,这取决于您的要求。

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

你试过这个吗?

UPDATE mytable SET somecolumn =
CASE WHEN somecolumn = 0 THEN 1
WHEN somecolumn IS NULL THEN NULL
WHEN somecolumn = 1 THEN 0
END

为什么不是简单的 bitfield = 1 - bitfield呢?

另一种方式是

DECLARE @thebit bit = 1, @theflipbit bit


SET @theflipbit = ~ @thebit


SELECT @theflipbit

其中“ ~”的意思是“非”操作符。它是干净的,你得到一个很好的代码来阅读。 “否定位”甚至更干净,它做的正是“不”运算符的设计。

查询(vb)

x = "select x from table"

更新(vb)

"update table set x=" Not(x*(1))

在 SQL Server 2014-12.0.2269.0中,一个简单的按位 NOT 操作符(~)对我很有用

在您的 T-SQL-中的 update 子句中

        Update TableName
SET    [bitColumnName] = ~[bitColumnName],
....
WHERE  ....

希望这个能帮上忙

档案-https://learn.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-not-transact-sql