トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

8-20 集合関数のBitAND,BitOR,BitXOR

SQLパズル

BitTable
Val
---
  2  (00010)
  3  (00011)
 10  (01010)
 14  (01110)
 30  (11110)

各桁を集約した、BitAND,BitOR,BitXOR
を求める。

BitANDは、00010 =  2
BitOR は、11111 = 31
BitXORは、11011 = 27
となります。

出力結果
BitAND  BitOR  BitXOR
------  -----  ------
     2     31      27

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table BitTable(Val) as
select  2 from dual union
select  3 from dual union
select 10 from dual union
select 14 from dual union
select 30 from dual;


SQL

select
min(BitAND(32,Val))+
min(BitAND(16,Val))+
min(BitAND( 8,Val))+
min(BitAND( 4,Val))+
min(BitAND( 2,Val))+
min(BitAND( 1,Val)) as BitAND,
max(BitAND(32,Val))+
max(BitAND(16,Val))+
max(BitAND( 8,Val))+
max(BitAND( 4,Val))+
max(BitAND( 2,Val))+
max(BitAND( 1,Val)) as BitOR,
mod(sum(sign(BitAND(32,Val))),2)*32+
mod(sum(sign(BitAND(16,Val))),2)*16+
mod(sum(sign(BitAND( 8,Val))),2)* 8+
mod(sum(sign(BitAND( 4,Val))),2)* 4+
mod(sum(sign(BitAND( 2,Val))),2)* 2+
mod(sum(sign(BitAND( 1,Val))),2) as BitXOR
from BitTable;


解説

BitAND関数で、ビットが立っているか調べてます。

10-162 ビット演算(AND,OR,XOR)
10-163 ビット演算(NOT)

MySQLの集合関数のBitAND,BitOR,BitXOR
PostgreSQLの集合関数のbit_and,bit_or