Есть ли элегантный способ инвертировать битовое значение в операторе вставки SQL? - PullRequest
55 голосов
/ 24 июля 2010

Я конвертирую некоторые данные в SQL Server:

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

, поэтому мне нужно инвертировать значение бита из исходной таблицы. Я ожидал, что NOT сработает, так как я это сделал бы в коде, но это не так Самый элегантный способ, который я могу придумать:

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

Есть ли более стандартный способ сделать это?

Ответы [ 3 ]

111 голосов
/ 24 июля 2010

Я не проверял это сам, но вы должны иметь возможность использовать побитовый оператор отрицания , ~ для бита:

INSERT INTO MYTABLE (AllowEdit) 
(SELECT ~PreventEdit FROM SourceTable)
25 голосов
/ 24 июля 2010

НЕ или XOR , если бит

SELECT ~PreventEdit FROM SourceTable
SELECT 1 ^ PreventEdit FROM SourceTable

Если это не совсем бит в SourceTable, тогда это:

SELECT 1 - PreventEdit FROM SourceTable

Редактировать: тест, примечание НЕ является дополнением 2 с, поэтому может дать странные результаты, если не используется в битовом столбце

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
0 голосов
/ 22 августа 2017

INSERT INTO MYTABLE (AllowEdit) (ВЫБЕРИТЕ ~ ISNULL (PreventEdit, 0) ОТ SourceTable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...