【发布时间】:2009-09-09 03:00:43
【问题描述】:
我正在尝试使用更新查询翻转 SQL Server 中的位字段,也就是说,我想将所有 0 变为 1,反之亦然。什么是最优雅的解决方案?
T-SQL 中似乎没有按位 NOT 运算符(除非我遗漏了一些明显的东西),而且我找不到任何其他执行更新的方法。
【问题讨论】:
标签: sql sql-server tsql
我正在尝试使用更新查询翻转 SQL Server 中的位字段,也就是说,我想将所有 0 变为 1,反之亦然。什么是最优雅的解决方案?
T-SQL 中似乎没有按位 NOT 运算符(除非我遗漏了一些明显的东西),而且我找不到任何其他执行更新的方法。
【问题讨论】:
标签: sql sql-server tsql
您不需要按位进行 - 只需将其与 1 / true 异或即可。
检查:
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?
【讨论】:
bitfield,一种方法可能是bitfield = 1 - ISNULL(bitfield,0)。请参阅文档中的ISNULL。
另一种方法是
DECLARE @thebit bit = 1, @theflipbit bit
SET @theflipbit = ~ @thebit
SELECT @theflipbit
其中“~”表示“NOT”运算符。它很干净,您可以阅读很好的代码。 “否定位”更加简洁,它完全符合“NOT”运算符的设计目的。
【讨论】:
我很确定大多数 SQL 风格都有按位 NOT,所以我检查了一下,确实有 appear to be one in TSQL。
从文档中,它是字符 ~。
【讨论】:
UPDATE tblTest SET MyBitField = CASE WHEN MyBitField = 1 THEN 0 ELSE 1 END
这很乏味,但每个人都会明白它在做什么。
编辑:
您可能还需要按照 cmets 中的建议考虑空值。当然取决于你的需求。
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
【讨论】:
一个简单的按位非运算符 (~) 在 SQL Server 2014 - 12.0.2269.0 中为我工作
在 T-SQL 中的更新子句中 -
Update TableName
SET [bitColumnName] = ~[bitColumnName],
....
WHERE ....
希望对你有帮助
参考 - https://docs.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-not-transact-sql
【讨论】:
你试过了吗?
UPDATE mytable SET somecolumn =
CASE WHEN somecolumn = 0 THEN 1
WHEN somecolumn IS NULL THEN NULL
WHEN somecolumn = 1 THEN 0
END
【讨论】:
查询 (vb)
x = "select x from table"
更新(vb)
"update table set x=" Not(x*(1))
【讨论】: