我正在尝试使用更新查询来翻转SQL Server中的位字段,也就是说,我想将所有0都变成1,反之亦然。什么是最优雅的解决方案?
在T-SQL中似乎没有按位NOT运算符(除非我遗漏了一些明显的东西),而且我无法找到执行更新的任何其他方式。
Answers:
您不需要按位操作-只需将其与1 / true进行XOR即可。
要检查它:
select idColumn, bitFieldY, bitFieldY ^ 1 as Toggled
from tableX
更新:
update tableX
set bitFieldY = bitFieldY ^ 1
where ...
bitFieldY ^ 1
将返回int
,所以如果你需要它是一个bit
再次,CAST
或CONVERT
回bit
。
为什么不简单bitfield = 1 - bitfield
?
另一种方法是
DECLARE @thebit bit = 1, @theflipbit bit
SET @theflipbit = ~ @thebit
SELECT @theflipbit
其中“〜”表示“ NOT”运算符。这很干净,您可以阅读一个不错的代码。“取反位”甚至更干净,它完全符合“ NOT”运算符的设计目的。
UPDATE tblTest SET MyBitField = CASE WHEN MyBitField = 1 THEN 0 ELSE 1 END
这很乏味,但每个人都会知道它在做什么。
编辑:
您可能还需要根据注释中的建议考虑空值。当然取决于您的要求。
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
一个简单的按位NOT运算符(〜)在SQL Server 2014中为我工作-12.0.2269.0
在T-SQL内部的update子句中-
Update TableName
SET [bitColumnName] = ~[bitColumnName],
....
WHERE ....
希望这可以帮助
参考-https: //docs.microsoft.com/zh-cn/sql/t-sql/language-elements/bitwise-not-transact-sql
查询(vb)
x = "select x from table"
更新(vb)
"update table set x=" Not(x*(1))