2010-07-24 11 views
40

jestem konwersji niektórych danych w SQL Server:Czy istnieje elegancki sposób na odwrócenie wartości bitu w instrukcji SQL Insert?

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

więc muszę odwrócić wartości bitowej z tabeli źródłowej. Spodziewałem się, że zadziała NOT, ponieważ tak właśnie zrobiłbym to w kodzie, ale tak nie jest. Najbardziej elegancki sposób mogę myśleć to:

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

Czy jest bardziej standardowy sposób to zrobić?

Odpowiedz

88

nie testowałem ten sam, ale powinieneś być w stanie korzystać z bitwise negation operator, ~ na kawałku:

INSERT INTO MYTABLE (AllowEdit) 
(SELECT ~PreventEdit FROM SourceTable) 
+1

to działa. Przysiek. –

+0

Awesome! Ładne i łatwe rozwiązanie. – Alex

21

NOT or XOR jeśli nieco

SELECT ~PreventEdit FROM SourceTable 
SELECT 1^PreventEdit FROM SourceTable 

Jeśli nie jest faktycznie nieco w SourceTable:

SELECT 1 - PreventEdit FROM SourceTable 

Edycja: test, uwaga NOT jest 2s uzupełnienie więc może dać dziwne wyniki, jeśli nie jest używany na kolumnie bitowym

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

SELECT [email protected], [email protected] 
SELECT 1^@bitvalue, 1^@intvalue 
SELECT 1 - @bitvalue, 1 - @intvalue 

SELECT @bitvalue = 0, @intvalue = 0 

SELECT [email protected], [email protected] 
SELECT 1^@bitvalue, 1^@intvalue 
SELECT 1 - @bitvalue, 1 - @intvalue 
+0

Brilliant. Wielkie dzięki, nie mogłem nigdzie tego znaleźć, ale prawdopodobnie były to moje hasła do wyszukiwania. – Molloch

-1

INSERT INTO MOJA_TABELA (AllowEdit) (SELECT ~ ISNULL (PreventEdit, 0) z SourceTable

+0

proszę dodać trochę informacji o tym, co robi twój kod i upewnić się, że zamykasz wszystkie otwarte paraghety – RealCheeseLord

Powiązane problemy