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


72

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

在T-SQL中似乎没有按位NOT运算符(除非我遗漏了一些明显的东西),而且我无法找到执行更新的任何其他方式。

Answers:


126

您不需要按位操作-只需将其与1 / true进行XOR即可。

要检查它:

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

更新:

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

MSDN T-SQL异或(^)


大!谢谢你-它就像一个魅力。我显然显然需要学习更多有关如何使用二进制运算符的知识
Billious


2
请记住,bitFieldY ^ 1将返回int,所以如果你需要它是一个bit再次,CASTCONVERTbit
Cᴏʀʏ

51

为什么不简单bitfield = 1 - bitfield


1
一种巧妙而优雅的方法,尤其是对于一次性查询而言,可读性并不重要。
Billious 2009年

1
@Billious和GBN你们都是正确的,但我想Austin的回答足以理解其明确含义中的目标。用1-x翻转一点会混淆新的commers,因此不是实现它的适当方法。我也同意,会有多种方法来做某事,但是如果有推荐的方法可以做到这一点,我们应该选择它,这大概比不推荐的方法要快。
KMX 2014年

也许对于一个bitfield可以为空的方法,应该是bitfield = 1 - ISNULL(bitfield,0)。请参阅文档中的ISNULL
Uwe Keim

1
@UweKeim就我个人而言,我不使用NULLable位。从未真正需要3个状态
gbn

谢谢,@ gbn。有时在有旧表的情况下会在以后添加新的位域列的时候这样做。(也许这可以通过更多的知识来解决得更加优雅)。
Uwe Keim

26

另一种方法是

DECLARE @thebit bit = 1, @theflipbit bit

SET @theflipbit = ~ @thebit

SELECT @theflipbit

其中“〜”表示“ NOT”运算符。这很干净,您可以阅读一个不错的代码。“取反位”甚至更干净,它完全符合“ NOT”运算符的设计目的。



12
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

当它以NULL开头时,会将MyBitField设置为1。不完全是位。
Shannon Severance

我认为这是不言而喻的...但是我会添加有关处理null的信息,以防万一。
梅奥

我倾向于同意其他一些人,然后选择〜或“ ^ 1”。特别是如果这是一次性的事情(看起来更干净)。但是,如果这会持续存在并且存在可维护性问题,那么此解决方案无疑是最直接的解决方案。
LJM,

在我的情况下,这是一个一次性查询,因此可维护性不是问题,但是是的,它同样适用。我实际上已经编写了一个类似的查询,但是在使CASE语句正常工作时遇到了麻烦。我现在意识到这是一个简单的语法错误。噢!
Billious 2009年

我也喜欢这个。有时我发现,如果遇到符号,我在代码中将无法理解,这可能会更难理解编码人员的意图。但这是显而易见的。
诺伯特·诺伯森


1

你有尝试过吗?

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.