2つの数値をビットデータとして扱いビット演算を行なう

BITAND ( number1 , number2 )
return [ NUMBER ]
| number1 | 数値式 (NUMBER 型) |
| number2 | 数値式 (NUMBER 型) |
- 数値式 number1 と number2 の論理積を NUMBER 型で戻す

BITAND 関数の内容
数値式 number1 と number1 を バイナリデータとしてビットにし、その論理積(AND)処理を行い。その結果を数値として戻す。
SQL 関数として BITAND 以外のビット演算は用意されていない。パッケージとしては UTL_RAW パッケージが利用できる。
使用方法の代表的な例としては DECODE と BIN_TO_NUM 関数を併用して ON になっているビットの検出するなどの用途がある。これはデータウェアハウスなどにおける非正規化データの格納などに用いられる手法でもある。
BITAND 使用例
SQL> select 'pattern match' from dual
where BITAND(bin_to_num(1,0,1), bin_to_num(0,0,1)) <> 0 ;
--------------------------
PATTERN MATCH
DECODE 関数と BIN_TO_NUM 関数 を使った例
SQL> select
decode(BITAND(bin_to_num(1,0,1),1), 1, '**1', '**0') "b1",
decode(BITAND(bin_to_num(1,0,1),2), 2, '*1*', '*0*') "b2",
decode(BITAND(bin_to_num(1,0,1),4), 4, '1**', '0**') "b3"
from dual;
B1 B2 B3
------ ----- ------
**1 *0* 1**
ビット演算 (OR、XOR)
前述どおり 論理和(BITOR) と 排他的論理和(BITXOR) は標準関数で用意されていないが UTL_RAW で代用することが可能。
BITOR 関数(論理和:2つの数値を OR でビット演算して戻す)
入力は自然数のみ有効 UTL_RAW パッケージを使う
- 書式
- BITOR( expr1 , expr2 )
自然数の数値式 expr1 と expr1 をビット単位に論理和(OR) 処理を行い、その数値を戻す。
-- BITOR
CREATE OR REPLACE FUNCTION RIVUS.BITOR( P_BITS1 IN NATURAL, P_BITS2 IN NATURAL )
RETURN NATURAL
IS
BEGIN
RETURN UTL_RAW.CAST_TO_BINARY_INTEGER(
UTL_RAW.BIT_OR(
UTL_RAW.CAST_FROM_BINARY_INTEGER(P_BITS1),
UTL_RAW.CAST_FROM_BINARY_INTEGER(P_BITS2)
)
);
END;
/
BITXOR 関数(排他的論理和:2つの数値を XOR でビット演算して戻す)
- 書式
- BITXOR ( expr1 , expr2 )
自然数の数値式 expr1 と expr2 をビット単位に排他的論理和(eXclusive OR) 処理を行い、その数値を戻す。
-- BITXOR
CREATE OR REPLACE FUNCTION RIVUS.BITXOR( P_BITS1 IN NATURAL, P_BITS2 IN NATURAL )
RETURN NATURAL
IS
BEGIN
RETURN UTL_RAW.CAST_TO_BINARY_INTEGER(
UTL_RAW.BIT_XOR(
UTL_RAW.CAST_FROM_BINARY_INTEGER(P_BITS1),
UTL_RAW.CAST_FROM_BINARY_INTEGER(P_BITS2)
)
);
END;
/
PL/SQL パッケージ - ビット操作関連
- UTL_RAW.BIT_COMPLEMENT 関数(ビットの補数)
SQL 関数 - ビット操作関連