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



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



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

844   8  

8 ответов:

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

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

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

обновление:

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

MSDN T-SQL Exclusive-OR (^)

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

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

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

query (vb)

x = "select x from table"

обновление (vb)

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

Comments

    Ничего не найдено.