如何在SQL中使用BIT_OR或BIT_AND进行二进制分组聚合?

风丽同学_7851

风丽同学_7851

2026-09-08

932人浏览

原创

bit_or和bit_and是按位聚合函数,非数值求和:bit_or(1,2,4)得7(0111),bit_or(3,3)仍为3;bit_and求所有行对应位全为1的交集,二者均需防null且仅适用于权限、状态等位图场景。

如何在sql中使用bit_or或bit_and进行二进制分组聚合?

BIT_OR 和 BIT_AND 是什么,为什么不能直接当 SUM 用?

它们是位运算聚合函数,不是数值累加。比如 BIT_OR(1, 2, 4) 得到 7(二进制 0111),因为把各数对应位“或”起来;而 SUM(1, 2, 4) 是 7 只是巧合,BIT_OR(3, 3) 还是 3(二进制 011 | 011 = 011),但 SUM(3, 3) 是 6。误当求和用会悄悄出错。

什么时候该用 BIT_OR 而不是 GROUP_CONCAT?

当你在做权限、状态、开关类标记的合并时——比如用户有多个角色,每个角色用一个 bit 表示(管理员=1,编辑=2,审核员=4),想快速知道某组用户 collectively 拥有哪些权限,BIT_OR(role_flag) 一行就搞定;用 GROUP_CONCAT 得到字符串 "1,2,4",后续还得解析、去重、转数字,没法直接参与位判断。

  • 适用场景:权限掩码、功能开关组合、状态位图(如文件属性:只读=1、隐藏=2、系统=4)
  • 不适用场景:需要保留原始值个数、顺序、重复信息时
  • 注意 MySQL 5.7+ 才支持窗口函数形式的 BIT_OR(),8.0+ 更稳定;MariaDB 10.3+ 支持,但旧版可能只有 BIT_OR() 作为聚合函数,不支持表达式参数

常见错误:NULL 值让整个 BIT_OR 结果变 NULL

只要分组里有一个 role_flag 是 NULL,BIT_OR(role_flag) 就返回 NULL,哪怕其他全是非空整数。这不是 bug,是 SQL 标准行为(聚合函数对 NULL 敏感)。修复方法很简单:

  • 用 COALESCE(role_flag, 0) 把 NULL 转成 0(不影响位或结果)
  • 或者加 WHERE role_flag IS NOT NULL 过滤掉无效行
  • 别用 IFNULL(role_flag, 0) —— 它在某些老版本 MySQL 中可能触发隐式类型转换,导致位运算异常

示例:

SELECT user_group, BIT_OR(COALESCE(role_flag, 0)) AS combined_flags
FROM user_roles
GROUP BY user_group;

BIT_AND 的陷阱:它求的是“所有成员共同拥有的位”,不是“并集”

BIT_AND 容易被名字误导。比如三个人的权限分别是 7(0111)、3(0011)、5(0101),BIT_AND 结果是 1(0001)——只有第 0 位在三个数中都为 1。这适合找交集场景(如“这个组里所有人都具备的功能”),但绝不是“汇总所有功能”。

  • 典型用途:检查一组记录是否全部开启某个开关(比如 BIT_AND(status & 8) > 0 判断是否全为“已归档”)
  • 性能注意:BIT_AND 和 BIT_OR 都是 O(n) 扫描,无索引加速;大数据量下别在没 WHERE 的大表上直接跑
  • 兼容性提醒:PostgreSQL 没原生 BIT_AND/BIT_OR 聚合,得用 bool_and(bool_or()) 组合模拟,或自定义聚合函数

真正难的不是写法,是确认业务语义到底要“并集”还是“交集”,以及是否允许 NULL 干扰结果——这两个点漏掉,查出来的数据看着像对,其实已经错了。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3883

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

831

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1009

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5701

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2663

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5680

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7501

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1030

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

892

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习