【问题标题】:Is there an elegant way to Invert a Bit value in an SQL insert Statement?是否有一种优雅的方法可以在 SQL 插入语句中反转位值?
【发布时间】: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)

有没有更标准的方法?

【问题讨论】:

    标签: sql sql-server bit-manipulation


    【解决方案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)

      【讨论】:

      • 请添加一些关于您的代码功能的信息,并确保关闭所有打开的括号
      猜你喜欢
      • 2017-03-03
      • 2023-01-20
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      相关资源
      最近更新 更多