我正在尝试使用更新查询在SQL Server中翻转一个字段,也就是说,我想将所有0都变为1,反之亦然。什么是最优雅的解决方案?
在T-SQL中似乎没有按位NOT运算符(除非我遗漏了一些明显的东西)并且我无法找到执行更新的任何其他方法。
答案 0 :(得分:110)
你不需要按位 - 不用于此 - 只需将其与1 / true进行异或。
检查一下:
select idColumn, bitFieldY, bitFieldY ^ 1 as Toggled
from tableX
更新:
update tableX
set bitFieldY = bitFieldY ^ 1
where ...
答案 1 :(得分:47)
为什么不是一个简单的bitfield = 1 - bitfield
?
答案 2 :(得分:22)
另一种方式是
DECLARE @thebit bit = 1, @theflipbit bit
SET @theflipbit = ~ @thebit
SELECT @theflipbit
其中"〜"意味着" NOT"运营商。它很干净,你会得到一个很好的代码来阅读。 "否定这一点"更清洁,它完全符合" NOT" operator是专为。
设计的答案 3 :(得分:13)
我很确定大多数SQL版本都有一个按位NOT,所以我检查了appear to be one in TSQL。
从文档中,它是角色~
。
答案 4 :(得分:10)
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
答案 5 :(得分:7)
A simple bitwise NOT operator (~) worked for me in SQL Server 2014 - 12.0.2269.0
In the update clause inside your T-SQL -
Update TableName
SET [bitColumnName] = ~[bitColumnName],
....
WHERE ....
Hope this helps
Ref - https://docs.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-not-transact-sql
答案 6 :(得分:0)
你试过这个吗?
UPDATE mytable SET somecolumn =
CASE WHEN somecolumn = 0 THEN 1
WHEN somecolumn IS NULL THEN NULL
WHEN somecolumn = 1 THEN 0
END
答案 7 :(得分:0)
查询(vb)
x = "select x from table"
更新(vb)
"update table set x=" Not(x*(1))