2010-07-24 17 views
40

che sto convertendo alcuni dati in SQL Server:Esiste un modo elegante per invertire un valore di bit in una istruzione di inserimento SQL?

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

quindi ho bisogno di invertire il valore del bit dalla tabella di origine. Mi aspettavo che NOT funzionasse, in quanto questo è come lo farei nel codice, ma non è così. Il modo più elegante che riesco a pensare è:

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

Esiste un modo più standard per farlo?

risposta

88

non ho la prova io stesso, ma si dovrebbe essere in grado di utilizzare il bitwise negation operator, ~ su un po ':

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

che funziona. Slick. –

+0

Fantastico! Soluzione piacevole e facile – Alex

21

NOT or XOR se po

SELECT ~PreventEdit FROM SourceTable 
SELECT 1^PreventEdit FROM SourceTable 

Se non è in realtà po' in SourceTable allora questo:

SELECT 1 - PreventEdit FROM SourceTable 

Edit: un test, non notate è 2s complemento così potrebbe dare risultati strani se non viene utilizzato su una colonna di bit

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

Brillante. Grazie mille, non sono riuscito a trovarlo da nessuna parte ma probabilmente erano i miei termini di ricerca. – Molloch

-1

INSERT INTO MYTABLE (AllowEdit) (SELEZIONA ~ ISNULL (PreventEdit, 0) FROM SourceTable

+0

per favore aggiungi una piccola informazione su cosa fa il tuo codice e assicurati di chiudere tutte le paraste che apri – RealCheeseLord

Problemi correlati