Подтвердить что ты не робот

Есть ли элегантный способ инвертировать значение бит в SQL-вставке Statement?

Я преобразовываю некоторые данные в SQL Server:

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

NOT или XOR, если бит

SELECT ~PreventEdit FROM SourceTable
SELECT 1 ^ PreventEdit FROM SourceTable

Если это не бит в SourceTable, это:

SELECT 1 - PreventEdit FROM SourceTable

Изменить: тест, примечание NOT является дополнением 2s, поэтому может дать нечетные результаты, если не используется в столбце бит

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

Ответ 3

ВСТАВИТЬ В MYTABLE (AllowEdit) (SELECT ~ ISNULL (PreventEdit, 0) FROM SourceTable