PostgreSQLでのbytea型のビット演算
PostgreSQL ver 9 以上を前提としてお話をする。
OracleからPostgreSQLへ移行する時、困った事があった。
PostgreSQLでのビット演算だ。( and , or , xor)
OracleのRAW型はPostgreSQLでいうbytea型である。
OracleのRAW型はビット演算できるし、バイト単位のアクセスも可能。
UTL_RAW
パッケージを使って。
UTL_RAW.BIT_AND(raw1, raw2)
UTL_RAW.BIT_OR(raw1, raw2)
UTL_RAW.SUBSTR(raw , 1 ,2)
でも、PostgreSQLになると途端に複雑になる。
PostgreSQLにはbytea型、bit型というものが存在する。それぞれの特徴は。
bytea型だと、バイト単位のアクセスは可能だが、ビット演算ができない。
bit型だと、バイト単位のアクセスは不可能だが、ビット演算ができる。
たいていの場合は、bytea型でデータベースに保存して、必要な時取り出してバイト単位でアクセスすれば問題ないでしょう。
ただ、保存してあるデータに何かのビット列とANDもしくはOR演算して、再びデータベースに戻すとケースもありうると思う。自分はそのケースだった。
ここで問題なのが、PostgreSQL に bytea <=> bit 変換の関数が用意されていないということだ。変換方法もマニュアルのどこにものっていない。
なので、Stackoverflowとかで調べないといけなくなる。
でも、また調べるのは面倒なので、bytea型同士のbit演算、bytea型<=>bit型の変換ができる関数をつくりました。
大抵の人は、データをとりだした後にスクリプト側(php,python,ruby etc..)で変換すると思うけど、こんなのデータベース側でやってほしいって人には役に立つかもしれないです。。