Ответ 1
Вам не нужно поразрядно - не для этого - просто XOR это с 1/true.
Чтобы проверить это:
select idColumn, bitFieldY, bitFieldY ^ 1 as Toggled
from tableX
Для обновления:
update tableX
set bitFieldY = bitFieldY ^ 1
where ...
Я пытаюсь перевернуть бит в SQL Server с помощью запроса на обновление, то есть хочу сделать все 0 в 1 и наоборот. Какое самое элегантное решение?
Кажется, что в T-SQL нет побитового оператора NOT (если я не вижу чего-то очевидного), и я не смог найти другого способа выполнить обновление.
Вам не нужно поразрядно - не для этого - просто XOR это с 1/true.
Чтобы проверить это:
select idColumn, bitFieldY, bitFieldY ^ 1 as Toggled
from tableX
Для обновления:
update tableX
set bitFieldY = bitFieldY ^ 1
where ...
Почему бы не просто bitfield = 1 - bitfield
?
Другой способ -
DECLARE @thebit bit = 1, @theflipbit bit
SET @theflipbit = ~ @thebit
SELECT @theflipbit
где "~" означает оператор "NOT". Он чист, и вы получаете хороший код для чтения. "отрицать бит" еще чище, и он делает именно то, для чего был разработан оператор "NOT".
Я был уверен, что большинство SQL-версий были побитовыми, поэтому я проверил и там кажется одним из TSQL.
Из документации это символ ~
.
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
Простой побитовый оператор NOT (~) работал у меня в SQL Server 2014 - 12.0.2269.0
В предложении обновления внутри вашего T-SQL -
Update TableName
SET [bitColumnName] = ~[bitColumnName],
....
WHERE ....
Надеюсь, что это поможет
Ref - 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
query (vb)
x = "select x from table"
update (vb)
"update table set x=" Not(x*(1))