Как перевернуть битовые поля в T-SQL?
Я пытаюсь перевернуть битовое поле в SQL Server с помощью запроса на обновление, то есть я хочу сделать все 0 в 1 и наоборот. Какое самое элегантное решение?
в T-SQL, похоже, нет побитового оператора NOT (если только я не пропустил что-то очевидное), и я не смог найти никакого другого способа выполнения обновления.
8 ответов:
вам не нужно побитовое-не для этого - просто XOR его с 1 / true.
чтобы проверить это:
select idColumn, bitFieldY, bitFieldY ^ 1 as Toggled from tableXобновление:
update tableX set bitFieldY = bitFieldY ^ 1 where ...
другой способ -
DECLARE @thebit bit = 1, @theflipbit bit SET @theflipbit = ~ @thebit SELECT @theflipbitгде "~" означает "не" оператора. Это чисто, и вы получаете хороший код для чтения. "negate The bit "еще чище, и он делает именно то, для чего был разработан оператор" NOT".
Я был уверен, что большинство вкусов SQL были побитовыми, поэтому я проверил, и там есть Кажется, один в TSQL.
из документации, это символ
~.
UPDATE tblTest SET MyBitField = CASE WHEN MyBitField = 1 THEN 0 ELSE 1 ENDэто мягко, но все поймут, что он делает.
EDIT:
вам также может потребоваться учитывать значения null, как это предлагается в комментариях. Зависит от вашего req, конечно.
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
в предложении update внутри вашего 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
Comments