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

时间:2009-09-09 03:00:44

标签: sql sql-server tsql

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

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

8 个答案:

答案 0 :(得分:110)

你不需要按位 - 不用于此 - 只需将其与1 / true进行异或。

检查一下:

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

更新:

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

MSDN T-SQL Exclusive-OR (^)

答案 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))