sql - 是否可以执行按位分组功能?

标签 sql mysql oracle group-by aggregate-functions

我在一个包含按位标志的表中有一个字段。假设为了示例,有三个标志:4 => 读取,2 => 写入,1 => 执行,表格如下所示*:

  user_id  |  file  |  permissions
-----------+--------+---------------
        1  |  a.txt |  6    ( <-- 6 = 4 + 2 = read + write)
        1  |  b.txt |  4    ( <-- 4 = 4 = read)
        2  |  a.txt |  4
        2  |  c.exe |  1    ( <-- 1 = execute)

我有兴趣找到在任何记录上设置了特定标志(例如:写入)的所有用户。要在一个查询中执行此操作,我认为如果您将所有用户的权限组合在一起,您将得到一个值,即他们权限的“总和”:

  user_id  |  all_perms
-----------+-------------
        1  |  6        (<-- 6 | 4 = 6)
        2  |  5        (<-- 4 | 1 = 5)

*我的实际表格与文件或文件权限无关,只是一个示例

有没有一种方法可以在一个语句中执行此操作?在我看来,它与带有 GROUP BY 的普通聚合函数非常相似:

SELECT user_id, SUM(permissions) as all_perms
FROM permissions
GROUP BY user_id

...但显然,是一些神奇的“按位或”函数而不是 SUM。有人知道这样的事吗?

(对于奖励积分,它在 oracle 中有效吗?)

最佳答案

MySQL:

SELECT user_id, BIT_OR(permissions) as all_perms
FROM permissions
GROUP BY user_id

关于sql - 是否可以执行按位分组功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1397913/

相关文章:

sql - 内连接三表

mysql - 查询可了解以下内容

mysql - 按 id 选择行,但末尾的可变数字除外

php - 对于 PDO 准备语句,我应该使用 bindParam()、bindValue() 还是 execute()

oracle - 从 CLOB 中假脱机数据

java - 当附加文件已经手动下载时,如何跳过下载附加文件?

oracle - 将 Oracle 数据库从一台 PC 转移到另一台 PC 的最简单方法是什么?

mysql - 根据另一行从表中获取一行

sql - 连接三个表不返回数据

c# - 合并 gridview 行并消除重复项