2012年8月2日木曜日

SQL:2進数の比較 - bitand関数


SQLのお話です。
10進数で入ったデータを2進数にして、比較をするためいろいろハマったメモ

カラムには以下のように、10進数でデータが入っています。


SQL> select DATA_FLGS from DATA;
ID DATA_FLGS
----------- ---------------
1 16644
2 24605
view raw decimal.sql hosted with ❤ by GitHub


これを、2進数にすると


「100000100000100」になります。

目的
今回の目的は、この5番目の値が「0か1か」を比較することです。



以下のようなSQLで比較が出来ることが分かりました。

SQL> select DATA_FLGS,bitand(DATA_FLGS,16) from DATA where ID='1' ;
DATA_FLGS BITAND(DATA_FLGS,16)
--------------- --------------------------
16644 0
SQL> select DATA_FLGS,bitand(DATA_FLGS,16) from DATA where ID='2' ;
DATA_FLGS BITAND(DATA_FLGS,16)
--------------- --------------------------
24605 16
view raw BITAND.sql hosted with ❤ by GitHub

いろいろバリエーションも変えたり。

select DATA_FLGS,bitand(DATA_FLGS,POWER(2, (5 - 1))) from DATA where ID='2' ;
DATA_FLGS BITAND(DATA_FLGS,POWER(2, (5 - 1)))
--------------- --------------------------
24605 16
view raw BITAND2.sql hosted with ❤ by GitHub

結果を、「○」「×」で表示したり

select DATA_FLGS,decode(bitand(DATA_FLGS,16),16,'○','×') from DATA where ID='1' ;
DATA_FLGS DE
--------------- --
16644 ×
select DATA_FLGS,decode(bitand(DATA_FLGS,16),16,'○','×') from DATA where ID='2' ;
DATA_FLGS DE
--------------- --
24605 ○

自分のメモ用です。
何かの、お役にたちますように~

参考

共有

Clip to Evernote
0follow