SQL Server:按位或单独的字段

时间:2017-10-13 16:00:15

标签: sql sql-server bitwise-operators

我不是数据库专家,也不确定在查询我的表时哪种方法最好。

我有一个表Availability,其中包含特定用户可以工作的星期几。

我已经像这样定义了我的模型

     monday: {
      type: Sequelize.BOOLEAN,
      allowNull: false,
      defaultValue: false,
    },
    tuesday: {
      type: Sequelize.BOOLEAN,
      allowNull: false,
      defaultValue: false,
    },
    wednesday: {
      type: Sequelize.BOOLEAN,
      allowNull: false,
      defaultValue: false,
    },
    thursday: {
      type: Sequelize.BOOLEAN,
      allowNull: false,
      defaultValue: false,
    },
    friday: {
      type: Sequelize.BOOLEAN,
      allowNull: false,
      defaultValue: false,
    },
    saturday: {
      type: Sequelize.BOOLEAN,
      allowNull: false,
      defaultValue: false,
    },
    sunday: {
      type: Sequelize.BOOLEAN,
      allowNull: false,
      defaultValue: false,
    },

现在,我想知道,在查询我可以使用的所有用户时,它会不会更快在星期一,有一个包含按位整数的列,所以我可以通过在SQL Server中使用OR按位运算符添加所有值和查询来插入它吗?

感谢您的帮助:)

于连。

2 个答案:

答案 0 :(得分:1)

您在询问是否可行或是否是一种好方法?

我在作业调度工具上做了大量工作,我的团队使用SQL Server中的SQL Agent作业调度程序作为开始的基础。在幕后,SQL Agent调度程序将调度存储在表中,并对一些列进行编码以对它们使用按位运算。

由于一周只有7天,您可以使用tinyint数据类型(1字节= 8位)来存储此可用性数据。

Ob01000000 could be Monday = 64
0b00100000 could be Tuesday = 32
etc.

然后当您在查询中提取数据时......

WHERE Availability.AvailableDays | 64 = 64

会给你周一工作的人。

就个人而言,我喜欢这种方法解决这些问题。

答案 1 :(得分:0)

在SQL Server内部,SQL Server将位列实现为SQL Server中的字节块。

  

SQL Server数据库引擎优化了位列的存储。如果   表中有8位或更少位列,列存储为   1个字节。如果有9到16位列,则列为   存储为2个字节,依此类推。

BOL Source

我建议使用bit列。数据库为您执行所有按位操作,因此您可以编写方便且易于阅读的过滤条件,如where [wednesday] = 1

此外,架构本身可防止任何尝试在tinyintsmallint等整数列中设置无效值。例如,假设您设置了一个允许7位的tinyint列。这会将值限制为0到127.需要检查约束以防止某人设置最高位并防止128到255(包括)之间的值。