我试图在 SQLServer 中使用一个更新查询来翻转一个位字段,也就是说,我想把所有的0变成1,反之亦然。最优雅的解决方案是什么?
在 T-SQL 中似乎没有按位 NOT 操作符(除非我遗漏了一些显而易见的东西) ,而且我也没能找到其他执行更新的方法。
我非常确定大多数 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呢?
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