类别:

按位表达式函数

BITXOR

返回两个数值或二进制表达式的按位 XOR。

别名:

BIT_XOR

另请参阅:

BITXOR_AGG

语法

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

实参

expr1

此表达式的计算结果必须为 INTEGER 值、BINARY 值或可转换为 INTEGER 值的数据类型的值。

expr2

此表达式的计算结果必须为 INTEGER 值、BINARY 值或可转换为 INTEGER 值的数据类型的值。

'padside'

当两个 BINARY 实参的长度不相同时,指定在哪一边为较短的长度填充值。指定以下不区分大小写的值之一:

  • LEFT – 在左侧填充值。

  • RIGHT – 在右侧填充值。

较短的值用零填充,使其等于较大值的长度。

此实参仅在指定了 BINARY 表达式时有效。

如果两个 BINARY 值的长度不同,则此实参是必需的。

返回

返回 INTEGER 值、BINARY 值或 NULL:

  • 当输入表达式包含 INTEGER 值时,返回一个代表输入表达式按位 XOR 的 INTEGER 值。

  • 当输入表达式包含 BINARY 值时,返回一个代表输入表达式按位 XOR 的 BINARY 值。

  • 如果任一输入值为 NULL,则返回 NULL。

使用说明

  • 两个输入表达式都必须求值到相同数据类型的值,可以是 INTEGER 或 BINARY。

  • 如果任一实参的数据类型是 数字,但不是 INTEGER(例如 FLOAT、DECIMAL 等),则将该实参转换为 INTEGER 值。

  • 如果实参的数据类型是字符串(例如 VARCHAR),则该实参将转换为 INTEGER 值(如果可能)。例如,字符串 12.3 转换为 12。如果该值无法转换为 INTEGER 值,则该值被视为 NULL。

  • 该函数不会将实参隐式转换为 BINARY 值。

示例

以下部分包含 INTEGER 实参值和 BINARY 实参值的示例。

将 BITAND、BITOR 和 BITXOR 与 INTEGER 实参值结合使用

创建一个简单的表并插入数据:

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 |
+------+-------+--------------------+-------------------+--------------------+

将 BITAND、BITOR 和 BITXOR 与 BINARY 实参值结合使用

创建一个简单的表并插入数据:

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 包含十六进制数字。有关更多信息,请参阅 二进制输入和输出

对长度相同的 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                        |
+------+----------+-----------------------------+----------------------------+-----------------------------+
语言: 中文