是否有一种优雅的方法来在SQL插入语句中反转位值?

Mol*_*och 56 sql sql-server bit-manipulation

我正在转换SQL Server中的一些数据:

INSERT INTO MYTABLE (AllowEdit)
(Select PreventEdit from SOURCETABLE)
Run Code Online (Sandbox Code Playgroud)

所以我需要从源表中反转位值.我期望NOT工作,因为这是我在代码中的方式,但事实并非如此.我能想到的最优雅的方式是:

INSERT INTO MYTABLE (AllowEdit)
(Select ABS(PreventEdit -1) from SOURCETABLE)
Run Code Online (Sandbox Code Playgroud)

有更标准的方法吗?

dri*_*iis 117

我自己没有测试过这个,但你应该可以使用bitwise negation运算符,~有点:

INSERT INTO MYTABLE (AllowEdit) 
(SELECT ~PreventEdit FROM SourceTable)
Run Code Online (Sandbox Code Playgroud)


gbn*_*gbn 26

如果位,则为NOT或XOR

SELECT ~PreventEdit FROM SourceTable
SELECT 1 ^ PreventEdit FROM SourceTable
Run Code Online (Sandbox Code Playgroud)

如果它实际上不在SourceTable中,那么这个:

SELECT 1 - PreventEdit FROM SourceTable
Run Code Online (Sandbox Code Playgroud)

编辑:一个测试,注意NOT是2s补码,如果不在位列上使用,可能会产生奇数结果

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
Run Code Online (Sandbox Code Playgroud)