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)