Oracle SQL 関数 : BITAND,BITOR,BITXOR : ビット演算
numberRet := BITAND( numberSrc1, numberSrc2 );
BITAND 関数は numberSrc1, numberSrc2 の数値をビット毎に AND 処理した値を返します。
numberSrc1, numberSrc2 のどちらかが NULL の場合は NULL を返します。
以下に BITAND 関数の例を示します。
2 BITAND( BIN_TO_NUM(0,1), BIN_TO_NUM(0,0) ) AS "01 AND 00" |
3 ,BITAND( BIN_TO_NUM(0,1), BIN_TO_NUM(0,1) ) AS "01 AND 01" |
4 ,BITAND( BIN_TO_NUM(0,1), BIN_TO_NUM(1,1) ) AS "01 AND 11" |
5 ,BITAND( BIN_TO_NUM(1,1), BIN_TO_NUM(1,0) ) AS "11 AND 10" |
6 ,BITAND( BIN_TO_NUM(1,1), NULL ) AS "11 AND NULL" |
01 AND 00 01 AND 01 01 AND 11 11 AND 10 11 AND NULL |
標準関数には BITOR , BITXOR 関数は存在しません。
そこで UTL_RAW パッケージを利用することで疑似的に BITAND 関数の様な処理ができます。
以下に UTL_RAW パッケージの BIT_OR 関数を利用する例を示します。
2 UTL_RAW.CAST_TO_BINARY_INTEGER( |
3 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(0))) AS "01 OR 00" |
4 ,UTL_RAW.CAST_TO_BINARY_INTEGER( |
5 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(1))) AS "01 OR 01" |
6 ,UTL_RAW.CAST_TO_BINARY_INTEGER( |
7 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(3))) AS "01 OR 11" |
8 ,UTL_RAW.CAST_TO_BINARY_INTEGER( |
9 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(3), UTL_RAW.CAST_FROM_BINARY_INTEGER(2))) AS "11 OR 10" |
10 ,UTL_RAW.CAST_TO_BINARY_INTEGER( |
11 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(3), UTL_RAW.CAST_FROM_BINARY_INTEGER(3))) AS "11 OR 11" |
01 OR 00 01 OR 01 01 OR 11 11 OR 10 11 OR 11 |
上の例のビットの OR 処理を行う UTL_RAW.BIT_OR 関数は2個の RAWデータ型 データが引数です。
そのため UTL_RAW.CAST_FROM_BINARY_INTEGER 関数で、数値を UTL_RAW パッケージで扱うデータ型である
RAWデータ型 に変換します。
以下に BIT_XOR 関数を利用する例を示します。
2 UTL_RAW.CAST_TO_BINARY_INTEGER( |
3 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(0))) AS "01 XOR 00" |
4 ,UTL_RAW.CAST_TO_BINARY_INTEGER( |
5 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(1))) AS "01 XOR 01" |
6 ,UTL_RAW.CAST_TO_BINARY_INTEGER( |
7 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(3))) AS "01 XOR 11" |
8 ,UTL_RAW.CAST_TO_BINARY_INTEGER( |
9 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(3), UTL_RAW.CAST_FROM_BINARY_INTEGER(2))) AS "11 XOR 10" |
10 ,UTL_RAW.CAST_TO_BINARY_INTEGER( |
11 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(3), UTL_RAW.CAST_FROM_BINARY_INTEGER(3))) AS "11 XOR 11" |
01 XOR 00 01 XOR 01 01 XOR 11 11 XOR 10 11 XOR 11 |
UTL_RAW.BIT_OR 関数及び UTL_RAW.BIT_XOR 関数を利用して BITAND 関数の様な
BITOR BITXOR を宣言してみます。
SQL> CREATE OR REPLACE FUNCTION BITOR ( |
10 WK1 := UTL_RAW.CAST_FROM_BINARY_INTEGER(InNum1); |
11 WK2 := UTL_RAW.CAST_FROM_BINARY_INTEGER(InNum2); |
12 RETURN UTL_RAW.CAST_TO_BINARY_INTEGER( UTL_RAW.BIT_OR(WK1, WK2) ); |
2 BITOR( BIN_TO_NUM(0,1), BIN_TO_NUM(0,0) ) AS "01 OR 00" |
3 ,BITOR( BIN_TO_NUM(0,1), BIN_TO_NUM(0,1) ) AS "01 OR 01" |
4 ,BITOR( BIN_TO_NUM(0,1), BIN_TO_NUM(1,1) ) AS "01 OR 11" |
5 ,BITOR( BIN_TO_NUM(1,1), BIN_TO_NUM(1,0) ) AS "11 OR 10" |
6 ,BITOR( BIN_TO_NUM(1,1), BIN_TO_NUM(1,1) ) AS "11 OR 11" |
01 OR 00 01 OR 01 01 OR 11 11 OR 10 11 OR 11 |
BITXOR 関数の宣言は以下の様になります。
SQL> CREATE OR REPLACE FUNCTION BITXOR ( |
10 WK1 := UTL_RAW.CAST_FROM_BINARY_INTEGER(InNum1); |
11 WK2 := UTL_RAW.CAST_FROM_BINARY_INTEGER(InNum2); |
12 RETURN UTL_RAW.CAST_TO_BINARY_INTEGER( UTL_RAW.BIT_XOR(WK1, WK2) ); |
2 BITXOR( BIN_TO_NUM(0,1), BIN_TO_NUM(0,0) ) AS "01 XOR 00" |
3 ,BITXOR( BIN_TO_NUM(0,1), BIN_TO_NUM(0,1) ) AS "01 XOR 01" |
4 ,BITXOR( BIN_TO_NUM(0,1), BIN_TO_NUM(1,1) ) AS "01 XOR 11" |
5 ,BITXOR( BIN_TO_NUM(1,1), BIN_TO_NUM(1,0) ) AS "11 XOR 10" |
6 ,BITXOR( BIN_TO_NUM(1,1), BIN_TO_NUM(1,1) ) AS "11 XOR 11" |
01 XOR 00 01 XOR 01 01 XOR 11 11 XOR 10 11 XOR 11 |
本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。