web-dev-qa-db-fra.com

Existe-t-il un moyen élégant d'inverser une valeur de bit dans une instruction d'insertion SQL?

Je convertis des données dans SQL Server:

INSERT INTO MYTABLE (AllowEdit)
(Select PreventEdit from SOURCETABLE)

j'ai donc besoin d'inverser la valeur en bits de la table source. Je m'attendais à ce que NOT fonctionne, car c'est ainsi que je le ferais dans le code, mais ce n'est pas le cas. La façon la plus élégante à laquelle je peux penser est:

INSERT INTO MYTABLE (AllowEdit)
(Select ABS(PreventEdit -1) from SOURCETABLE)

Existe-t-il une manière plus standard de procéder?

56
Molloch

Je n'ai pas testé cela moi-même, mais vous devriez pouvoir utiliser opérateur de négation au niveau du bit , ~ un peu:

INSERT INTO MYTABLE (AllowEdit) 
(SELECT ~PreventEdit FROM SourceTable)
114
driis

NON ou XOR si bit

SELECT ~PreventEdit FROM SourceTable
SELECT 1 ^ PreventEdit FROM SourceTable

Si ce n'est pas réellement un bit dans SourceTable, alors ceci:

SELECT 1 - PreventEdit FROM SourceTable

Edit: Un test, notez que NOT est un complément de 2, donc pourrait donner des résultats étranges s'il n'est pas utilisé sur une colonne de bits

DECLARE @bitvalue bit = 1, @intvalue int = 1;

SELECT ~@bitvalue, ~@intvalue
SELECT 1 ^ @bitvalue, 1 ^ @intvalue
SELECT 1 - @bitvalue, 1 - @intvalue

SELECT @bitvalue = 0, @intvalue = 0

SELECT ~@bitvalue, ~@intvalue
SELECT 1 ^ @bitvalue, 1 ^ @intvalue
SELECT 1 - @bitvalue, 1 - @intvalue
25
gbn

INSÉRER DANS MYTABLE (AllowEdit) (SELECT ~ ISNULL (PreventEdit, 0) FROM SourceTable

0
Michel MARTIN