有没有一种优雅的方法可以反转SQL insert语句中的位值?

有没有一种优雅的方法可以反转SQL insert语句中的位值?,sql,sql-server,bit-manipulation,Sql,Sql Server,Bit Manipulation,我正在转换SQL Server中的一些数据: INSERT INTO MYTABLE (AllowEdit) (Select PreventEdit from SOURCETABLE) 所以我需要从源表中反转位值。我本以为不会工作,因为我在代码中就是这样做的,但事实并非如此。我能想到的最优雅的方式是: INSERT INTO MYTABLE (AllowEdit) (Select ABS(PreventEdit -1) from SOURCETABLE) 有更标准的方法吗?我自己没有测试过,

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

INSERT INTO MYTABLE (AllowEdit)
(Select PreventEdit from SOURCETABLE)
所以我需要从源表中反转位值。我本以为不会工作,因为我在代码中就是这样做的,但事实并非如此。我能想到的最优雅的方式是:

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

有更标准的方法吗?

我自己没有测试过,但您应该可以稍微使用,~:

INSERT INTO MYTABLE (AllowEdit) 
(SELECT ~PreventEdit FROM SourceTable)
如果位

如果它在SourceTable中实际上不是位,那么:

SELECT 1 - PreventEdit FROM SourceTable
编辑:一个测试,注释不是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

插入到MYTABLE AllowEdit中
从SourceTable中选择~ISNULLPreventEdit,0

Brilliant。非常感谢,我在任何地方都找不到这个,但它可能是我的搜索词。在我的例子中,XOR证明了有用的方法。我有一个表,其中一列被标记为'IsDeleted',但它是一个int,一点也不。我试着把它转换成IsActive。简单地执行~IsDeleted会创建一个值-2,这绝对不对。因此,我选择了1^IsDeleted以获得正确的IsActive值1^1=位0,1^0=位1。请添加一些有关代码功能的信息,并确保关闭所有打开的文件
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