根据列值构建字符串[Oracle SQL]

时间:2014-02-04 23:07:55

标签: sql oracle

我有这张桌子:

   ID | UNIT|   CODE
    2 |  A  |   bit0
    2 |  A  |   bit2
    1 |  B  |   bit2
    2 |  B  |   bit7
    1 |  B  |   bit5
    1 |  C  |   bit7

我想知道如何根据ID和UNIT对这些位进行分组?例如,上面源表的输出将是:

ID|UNIT|  CODE
2 | A  |00000101
1 | B  |00100100
1 | C  |10000000
2 | B  |10000000

是一个CASE语句+连接1和0是最好的选择吗?我真的不这么认为,但这是我目前唯一能找到的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

可能在MySQL中使用bit_or聚合函数,但它在Oracle中不可用。

如果您从未设置过多个位,则可以执行

select id, unit,
       sum(case when code = 'bit0' then 1
                when code = 'bit1' then 2
                when code = 'bit2' then 4
                when code = 'bit3' then 8
                when code = 'bit4' then 16
                when code = 'bit5' then 32
                when code = 'bit6' then 64
                when code = 'bit7' then 128
                else 0
            end)
from table t
group by id, unit;

但这并不是一个令人满意的答案。

相反,您需要将值展开,聚合并将它们带回来。这是一个结果是字符串的方法:

select id, unit,
       (max(case when code = 'bit0' then 1 else 0 end) ||
        max(case when code = 'bit1' then 1 else 0 end) ||
        max(case when code = 'bit2' then 1 else 0 end) ||
        max(case when code = 'bit3' then 1 else 0 end) ||
        max(case when code = 'bit4' then 1 else 0 end) ||
        max(case when code = 'bit5' then 1 else 0 end) ||
        max(case when code = 'bit6' then 1 else 0 end) ||
        max(case when code = 'bit7' then 1 else 0 end)
       )
from table t
group by id, unit;

以下是结果为整数的方法:

select id, unit,
       (max(case when code = 'bit0' then 1 else 0 end) +
        max(case when code = 'bit1' then 2 else 0 end) +
        max(case when code = 'bit2' then 4 else 0 end) +
        max(case when code = 'bit3' then 8 else 0 end) +
        max(case when code = 'bit4' then 16 else 0 end) +
        max(case when code = 'bit5' then 32 else 0 end) +
        max(case when code = 'bit6' then 64 else 0 end) +
        max(case when code = 'bit7' then 128 else 0 end)
       )
from table t
group by id, unit;

你可以在SQL Fiddle看到后者的工作here