Подтвердить что ты не робот

Как перевернуть битовые поля в T-SQL?

Я пытаюсь перевернуть бит в SQL Server с помощью запроса на обновление, то есть хочу сделать все 0 в 1 и наоборот. Какое самое элегантное решение?

Кажется, что в T-SQL нет побитового оператора NOT (если я не вижу чего-то очевидного), и я не смог найти другого способа выполнить обновление.

4b9b3361

Ответ 1

Вам не нужно поразрядно - не для этого - просто XOR это с 1/true.

Чтобы проверить это:

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

Для обновления:

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

MSDN T-SQL Exclusive-OR (^)

Ответ 2

Почему бы не просто bitfield = 1 - bitfield?

Ответ 3

Другой способ -

DECLARE @thebit bit = 1, @theflipbit bit

SET @theflipbit = ~ @thebit

SELECT @theflipbit

где "~" означает оператор "NOT". Он чист, и вы получаете хороший код для чтения. "отрицать бит" еще чище, и он делает именно то, для чего был разработан оператор "NOT".

Ответ 4

Я был уверен, что большинство SQL-версий были побитовыми, поэтому я проверил и там кажется одним из TSQL.

Из документации это символ ~.

Ответ 5

UPDATE tblTest SET MyBitField = CASE WHEN MyBitField = 1 THEN 0 ELSE 1 END

Это мягко, но все поймут, что он делает.

EDIT:

Вам также может потребоваться учет нулей, как это предлагается в комментариях. Зависит от вашего требования, конечно.

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

Ответ 7

Вы пробовали это?

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

Ответ 8

query (vb)

x = "select x from table"

update (vb)

"update table set x=" Not(x*(1))