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

Posted

技术标签:

【中文标题】是否有一种优雅的方法可以在 SQL 插入语句中反转位值?【英文标题】:Is there an elegant way to Invert a Bit value in an SQL insert Statement? 【发布时间】:2011-03-20 11:32:15 【问题描述】:

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

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

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

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

有没有更标准的方法?

【问题讨论】:

【参考方案1】:

这个我自己没有测试过,不过你应该可以使用bitwise negation operator,~一点:

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

【讨论】:

【参考方案2】:

NOT or 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 ~@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

【讨论】:

太棒了。非常感谢,我在任何地方都找不到这个,但它可能是我的搜索词。 在我的例子中,XOR 证明了有用的方法。我有一个表,其中一列标记为“IsDeleted”,但它是一个 int,而不是一个位。我试图将其转换为 IsActive。简单地做 ~IsDeleted 创建了 -2 的值(肯定不正确)。所以,我选择1 ^ IsDeleted 来获得正确的 IsActive 值(1 ^ 1 = bit 0, 1 ^ 0 = bit 1)。【参考方案3】:

插入 MYTABLE(允许编辑) (SELECT ~ISNULL(PreventEdit,0) FROM SourceTable)

【讨论】:

请添加一些关于您的代码功能的信息,并确保关闭所有打开的括号

以上是关于是否有一种优雅的方法可以在 SQL 插入语句中反转位值?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 SQL 中反转 select 语句?

php sql 异常判断

是否有一种优雅的方法可以为多租户应用程序克隆具有所有配置(客户端和角色)的 Keycloak 领域?

是否有一种优雅的 Pythonic 方式来计算已处理的数据? [复制]

我可以在一个语句中运行多个 SQL 部分吗?

如何使用 excel 生成大型更新 sql 语句?