是否有一种优雅的方法可以在 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 插入语句中反转位值?的主要内容,如果未能解决你的问题,请参考以下文章
是否有一种优雅的方法可以为多租户应用程序克隆具有所有配置(客户端和角色)的 Keycloak 领域?