mysql - 使用 MySQL 中的位域列将一行分解为多行

标签 mysql sql bit-manipulation

我有一个名为 warnings 的位域,存储为一个 int。 我想得到每个人的警告列表

假设我们有一张 table

NAME,  WARNINGS
alex,  0
mike,  5
sarah, 2

其中整数的每一位对应一个警告#(位位置)。 目前这是在 perl 中使用 for 循环完成的

for(my $i=0; $i < $warning_size;$i++ ){
     if( (1 << $i ) & $warning != 0){
         print "$name\t" . $i+1 ."\n";
     }
}

有什么方法可以让我通过 mysql 查询来处理这个问题。

对于上面的例子,我想要下面的输出:

name, warning
-------------
mike  1
mike  3
sarah 2

我试图将其归结为一个选择语句,

谢谢

最佳答案

试试这个 -

CREATE TABLE warn_bits(
  b INT(11) NOT NULL
);

INSERT INTO warn_bits VALUES 
  (1),
  (2),
  (3),
  (4),
  (5),
  (6),
  (7),
  (8);

SELECT w.name, wb.b FROM warnings w
  JOIN warn_bits wb
    ON ((w.WARNINGS >> wb.b - 1) & 1) > 0
ORDER BY w.name, wb.b;

+-------+---+
| name  | b |
+-------+---+
| mike  | 1 |
| mike  | 3 |
| sarah | 2 |
+-------+---+

您可以扩展 warn_bits 表以支持 INT 或 BIGINT 数字。


编辑2

SELECT w.name, wb.b FROM warnings w
  JOIN (
  SELECT 1 b UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
  SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8
  ) wb
    ON ((w.WARNINGS >> wb.b - 1) & 1) > 0
ORDER BY w.name, wb.b;

关于mysql - 使用 MySQL 中的位域列将一行分解为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8521885/

相关文章:

java - Hibernate Criteria - 日期比较未返回正确结果

php - SQL 1064 错误 - 损坏的脚本

mysql - SQL 分组依据 : Get values of 'max' record

c# - 删除表时 ExecuteNonQuery 会返回什么?

mysql - 如何选取前一天的值?

c - 如何将 MSB 复制到字节的其余部分?

c - 仅当它为 0 时如何启用 octed 中的位?

mysql 计算包含 LEFT JOIN 的查询中的行数挂起服务器

mysql - 在 MySQL 中处理多个时区

assembly - 为什么汇编 POPCNTQ 基准测试会比使用整数技巧的 native Go 函数慢?