83 Stimmen

Wie kann man Bit-Felder in T-SQL spiegeln?

Ich versuche, ein Bit-Feld in SQL Server mithilfe einer Aktualisierungsabfrage umzudrehen, d. h. ich möchte alle 0en in 1en umwandeln und umgekehrt. Was ist die eleganteste Lösung?

Es scheint keinen bitweisen NOT-Operator in T-SQL zu geben (es sei denn, ich übersehe etwas Offensichtliches), und ich habe keine andere Möglichkeit gefunden, die Aktualisierung durchzuführen.

141voto

Austin Salonen Punkte 47404

Sie brauchen dafür kein bitweises-nicht, sondern nur ein XOR mit 1 / true.

Zur Kontrolle:

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

Zu aktualisieren:

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

MSDN T-SQL Exklusiv-OR (^)

0 Stimmen

Großartig! Vielen Dank dafür - es funktioniert wie ein Zauber. Ich muss offensichtlich ein bisschen mehr über die Verwendung von binären Operatoren lernen

1 Stimmen

2 Stimmen

Bitte beachten Sie, dass bitFieldY ^ 1 gibt eine int Wenn Sie es also brauchen, um eine bit wieder, CAST o CONVERT es zurück zu bit .

56voto

gbn Punkte 407102

Warum nicht eine einfache bitfield = 1 - bitfield ?

2 Stimmen

Ein genialer und eleganter Ansatz, insbesondere für eine einmalige Abfrage, bei der die Lesbarkeit nicht wichtig ist.

1 Stimmen

@Billious und GBN, ihr habt beide recht, aber ich denke, Austins Antwort ist gut genug, um das Ziel in seiner klaren Bedeutung zu verstehen. Ein bisschen mit 1-x herumzuflirten wird die Neuankömmlinge verwirren und ist daher nicht der richtige Weg, um das Ziel zu erreichen. Ich stimme auch zu, dass es mehr als einen Weg gibt, etwas zu tun, aber wenn es einen empfohlenen Weg gibt, sollten wir ihn einschlagen, der vermutlich schneller ist als ein nicht empfohlener Weg.

0 Stimmen

Vielleicht für ein nullbares bitfield wäre ein Ansatz, der bitfield = 1 - ISNULL(bitfield,0) . Siehe ISNULL in der Dokumentation.

30voto

Eine andere Möglichkeit ist

DECLARE @thebit bit = 1, @theflipbit bit

SET @theflipbit = ~ @thebit

SELECT @theflipbit

wobei "~" für den Operator "NOT" steht. Das ist sauber und man erhält einen gut lesbaren Code. "negate the bit" ist sogar noch sauberer und tut genau das, wofür der "NOT"-Operator gedacht war.

0 Stimmen

Dieselbe Idee, aber NULLS wird zu true: UPDATE TABLE_NAME SET BIT_FIELD= IIF(BIT_FIELD IS NULL,1,~ BIT_FIELD)

20voto

Thomas Owens Punkte 110966

Ich war mir ziemlich sicher, dass die meisten SQL-Varianten ein bitweises NOT haben, also habe ich nachgesehen, und das gibt es scheinen eine in TSQL zu sein .

Aus der Dokumentation geht hervor, dass es sich um das Zeichen ~ .

4 Stimmen

SELECT ~MyBitField from MyTable Mit anderen Worten: Update MyTable set MyBitField = ~MyBitField

14voto

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

Er ist fade, aber jeder wird verstehen, was er tut.

EDIT:

Möglicherweise müssen Sie auch Nullen berücksichtigen, wie in den Kommentaren vorgeschlagen. Hängt natürlich von Ihren Anforderungen ab.

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

0 Stimmen

Dadurch wird MyBitField auf 1 gesetzt, wenn es mit NULL beginnt. Das ist nicht gerade eine Umkehrung des Bits.

0 Stimmen

Ich dachte, es war selbstverständlich... aber ich füge Informationen über den Umgang mit Nullen nur für den Fall.

0 Stimmen

Ich würde dazu neigen, einigen der anderen zuzustimmen und die ~ oder die "^ 1" zu wählen. Vor allem, wenn dies eine einmalige Sache ist (scheint einfach sauberer). Allerdings, wenn dies etwas, das rund bleiben wird und Wartbarkeit in Frage steht, ist diese Lösung sicherlich die meisten geradeaus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X