カテゴリ:

ビット単位の式関数

BITOR

2つの数値式またはバイナリ式のビット単位 OR を返します。

エイリアス:

BIT_OR

こちらもご参照ください。

BITOR_AGG

構文

BITOR( <expr1> , <expr2> [ , '<padside>' ] )
Copy

引数

expr1

この式は、 INTEGER 値、BINARY 値、または INTEGER 値にキャストできるデータ型の値に評価される必要があります。

expr2

この式は、 INTEGER 値、BINARY 値、または INTEGER 値にキャストできるデータ型の値に評価される必要があります。

'padside'

2つの BINARY 引数値が同じ長さでない場合、短い方の値のどちら側に埋め込むかを指定します。以下の大文字と小文字を区別しない値のいずれかを指定します。

  • LEFT - 値の左側に埋め込みます。

  • RIGHT - 値の右側に埋め込みます。

短い方の値は、大きい方の値の長さと同じになるようにゼロで埋め込みます。

この引数は、 BINARY 式が指定されている場合にのみ有効です。

2つの BINARY 値の長さが異なる場合、この引数が必要です。

戻り値

INTEGER 値、 BINARY 値、または NULL を返します。

  • 入力式に INTEGER 値が含まれる場合、入力式のビット単位 OR を表す INTEGER 値を返します。

  • 入力式に BINARY 値が含まれる場合、入力式のビット単位 OR を表す BINARY 値を返します。

  • いずれかの入力値が NULL の場合、 NULL を返します。

使用上の注意

  • どちらの入力式も、同じデータ型(INTEGER または BINARY のいずれか)の値に評価される必要があります。

  • いずれかの引数のデータ型が 数値 であるけれども INTEGER ではない場合(例: FLOAT、 DECIMAL など)、引数は INTEGER 値にキャストされます。

  • いずれかの引数のデータ型が文字列(VARCHAR など)の場合、可能であれば引数は INTEGER 値にキャストされます。例えば、文字列 12.312 にキャストされます。値を INTEGER 値にキャストできない場合、値は NULL として扱われます。

  • この関数は、引数を暗黙的に BINARY 値にキャストしません。

以下のセクションには、 INTEGER 引数値と BINARY 引数値の例が含まれています。

INTEGER 引数値での BITAND、 BITOR、 BITXOR の使用

簡単なテーブルを作成し、データを挿入します。

CREATE OR REPLACE TABLE bits (ID INTEGER, bit1 INTEGER, bit2 INTEGER);
Copy
INSERT INTO bits (ID, bit1, bit2) VALUES 
  (   11,    1,     1),    -- Bits are all the same.
  (   24,    2,     4),    -- Bits are all different.
  (   42,    4,     2),    -- Bits are all different.
  ( 1624,   16,    24),    -- Bits overlap.
  (65504,    0, 65504),    -- Lots of bits (all but the low 6 bits).
  (    0, NULL,  NULL)     -- No bits.
  ;
Copy

クエリを実行します。

SELECT bit1, 
       bit2, 
       BITAND(bit1, bit2), 
       BITOR(bit1, bit2), 
       BITXOR(bit1, BIT2)
  FROM bits
  ORDER BY bit1;
Copy
+------+-------+--------------------+-------------------+--------------------+
| BIT1 |  BIT2 | BITAND(BIT1, BIT2) | BITOR(BIT1, BIT2) | BITXOR(BIT1, BIT2) |
|------+-------+--------------------+-------------------+--------------------|
|    0 | 65504 |                  0 |             65504 |              65504 |
|    1 |     1 |                  1 |                 1 |                  0 |
|    2 |     4 |                  0 |                 6 |                  6 |
|    4 |     2 |                  0 |                 6 |                  6 |
|   16 |    24 |                 16 |                24 |                  8 |
| NULL |  NULL |               NULL |              NULL |               NULL |
+------+-------+--------------------+-------------------+--------------------+

BINARY 引数値での BITAND、 BITOR、 BITXOR の使用

簡単なテーブルを作成し、データを挿入します。

CREATE OR REPLACE TABLE bits (ID INTEGER, bit1 BINARY(2), bit2 BINARY(2), bit3 BINARY(4));

INSERT INTO bits VALUES
  (1, x'1010', x'0101', x'11001010'),
  (2, x'1100', x'0011', x'01011010'),
  (3, x'BCBC', x'EEFF', x'ABCDABCD'),
  (4, NULL, NULL, NULL);
Copy

注釈

BINARY 値は、 x'value' 表記で挿入されます。 value には16進数が含まれています。詳細については、 バイナリ入出力 をご参照ください。

同じ長さの BINARY 列に対してクエリを実行します。

SELECT bit1,
       bit2,
       BITAND(bit1, bit2),
       BITOR(bit1, bit2),
       BITXOR(bit1, bit2)
  FROM bits;
Copy
+------+------+--------------------+-------------------+--------------------+
| BIT1 | BIT2 | BITAND(BIT1, BIT2) | BITOR(BIT1, BIT2) | BITXOR(BIT1, BIT2) |
|------+------+--------------------+-------------------+--------------------|
| 1010 | 0101 | 0000               | 1111              | 1111               |
| 1100 | 0011 | 0000               | 1111              | 1111               |
| BCBC | EEFF | ACBC               | FEFF              | 5243               |
| NULL | NULL | NULL               | NULL              | NULL               |
+------+------+--------------------+-------------------+--------------------+

'padside' 引数を指定せずに、長さの異なる BINARY 列に対してクエリを実行しようとすると、エラーが返されます。

SELECT bit1,
       bit3,
       BITAND(bit1, bit3),
       BITOR(bit1, bit3),
       BITXOR(bit1, bit3)
  FROM bits;
Copy
100544 (22026): The lengths of two variable-sized fields do not match: first length 2, second length 4

長さの異なる BINARY 列に対してクエリを実行し、小さい方の引数値の左側に埋め込みます。

SELECT bit1,
       bit3,
       BITAND(bit1, bit3, 'LEFT'),
       BITOR(bit1, bit3, 'LEFT'),
       BITXOR(bit1, bit3, 'LEFT')
  FROM bits;
Copy
+------+----------+----------------------------+---------------------------+----------------------------+
| BIT1 | BIT3     | BITAND(BIT1, BIT3, 'LEFT') | BITOR(BIT1, BIT3, 'LEFT') | BITXOR(BIT1, BIT3, 'LEFT') |
|------+----------+----------------------------+---------------------------+----------------------------|
| 1010 | 11001010 | 00001010                   | 11001010                  | 11000000                   |
| 1100 | 01011010 | 00001000                   | 01011110                  | 01010110                   |
| BCBC | ABCDABCD | 0000A88C                   | ABCDBFFD                  | ABCD1771                   |
| NULL | NULL     | NULL                       | NULL                      | NULL                       |
+------+----------+----------------------------+---------------------------+----------------------------+

長さの異なる BINARY 列に対してクエリを実行し、小さい方の引数値の右側に埋め込みます。

SELECT bit1,
       bit3,
       BITAND(bit1, bit3, 'RIGHT'),
       BITOR(bit1, bit3, 'RIGHT'),
       BITXOR(bit1, bit3, 'RIGHT')
  FROM bits;
Copy
+------+----------+-----------------------------+----------------------------+-----------------------------+
| BIT1 | BIT3     | BITAND(BIT1, BIT3, 'RIGHT') | BITOR(BIT1, BIT3, 'RIGHT') | BITXOR(BIT1, BIT3, 'RIGHT') |
|------+----------+-----------------------------+----------------------------+-----------------------------|
| 1010 | 11001010 | 10000000                    | 11101010                   | 01101010                    |
| 1100 | 01011010 | 01000000                    | 11011010                   | 10011010                    |
| BCBC | ABCDABCD | A88C0000                    | BFFDABCD                   | 1771ABCD                    |
| NULL | NULL     | NULL                        | NULL                       | NULL                        |
+------+----------+-----------------------------+----------------------------+-----------------------------+