【问题标题】:SQL - Integer Type - Detect bitSQL - 整数类型 - 检测位
【发布时间】:2011-08-23 21:27:29
【问题描述】:

使用 SQL,我想检测整数列类型 (MySQL) 的某个位是否打开?

我该怎么办?

基本上,我想检测一个位是否开启,如果它开启,则忽略。

我现在正在使用这样的东西:

WHERE (column & 2) != 2

【问题讨论】:

  • 你说的是位列还是整数列?你是什​​么意思?请改写问题。
  • 按位标志适用于 3GL 中的枚举,但 4GL(如 SQL)最适用于关系数据,即元组与属性的关系。

标签: mysql sql bitwise-operators


【解决方案1】:

假设您正在检查第 3 位然后...

SELECT bits & 8 = 8 FROM table;

这将返回一个二进制(1 或 0),用于表示“bits”列中每一行的相关位(在本例中为第三位)是打开还是关闭。

第 x 位使用 2^x 而不是 8。

例如,要检查第 5 位,我们将使用 2^5 = 32

SELECT bits & 32 = 32 FROM table;

但是,这是不必要的复杂。只需在多列中使用布尔值,这将使事情变得更容易。

【讨论】:

  • SELECT bits & 8 = 8 FROM table 到底是什么;正在做?我们正在为一列选择位 & 8 = 8?
  • 基本思想是“&”运算符确定其两个参数中“打开”的位。因此 (bits & 8 = 8) 确定 8 (这只是第三位)和列“位”是否具有相应的位。查询的结果作为一个整体是一系列二进制结果,如果第三位打开。
  • 有时您可能想在一条记录上使用 20 个布尔字段,那么按位计算就有意义了
【解决方案2】:

使用&bitwise AND operator

SELECT ID, myfield
FROM mytable
WHERE (myfield & 16) > 0  

【讨论】:

    【解决方案3】:

    SQL 支持标准位运算符:

    DECLARE @BitMask INT
    SET @BitMask = 34
    
    SELECT 
        @BitMask & 32, -- Returns 32, ON 
        @BitMask & 16  -- Returns 0, OFF
    

    【讨论】:

      【解决方案4】:

      对于 mysql,您可以使用按位 AND 运算符 & 和位掩码

      例如,如果为 column1 设置了位 2(从 0 开始计数),则要获取布尔值 true,请使用以下命令:

      where (column1 & 4) = 4
      

      这将适用于多个位检查,例如检查位 0 和 2 是否都已设置:

      where (column1 & 5) = 5
      

      【讨论】:

        【解决方案5】:

        您应该为您正在使用的数据库平台标记问题。

        如果这是 SQL Server 2008,您可以使用按位运算符(特别是按位或等于)与位设置为您有兴趣测试的模式的整数进行比较:http://msdn.microsoft.com/en-us/library/cc627409.aspx

        请注意,通过这种方式打包整数,您可能会阻止在这些列上使用任何索引。

        【讨论】:

          【解决方案6】:

          我相信这会帮助你实现你想要的:

          SQL bit manipulation

          【讨论】:

            【解决方案7】:

            在 TSQL 中,1 = 真,0 = 假。
            在 MS Access 中,-1 = 真,0 = 假。
            ...
            也许有人可以填写其他方言。

            如果您在应用层中解释位,您应该能够使用转换函数(例如,在 vb 中您可能会说 IF convert.toboolean(myValue) THEN... 来解释真假。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-19
              • 2019-07-24
              • 2011-06-09
              • 2019-09-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多