- 类别:
BITXOR¶
返回两个数值或二进制表达式的按位 XOR。
- 别名:
BIT_XOR
- 另请参阅:
语法¶
BITXOR( <expr1> , <expr2> [ , '<padside>' ] )
实参¶
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);
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.
;
运行查询:
SELECT bit1,
bit2,
BITAND(bit1, bit2),
BITOR(bit1, bit2),
BITXOR(bit1, BIT2)
FROM bits
ORDER BY bit1;
+------+-------+--------------------+-------------------+--------------------+
| 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);
备注
BINARY 值是使用 x'value'
表示法插入的,其中 value
包含十六进制数字。有关更多信息,请参阅 二进制输入和输出。
对长度相同的 BINARY 列运行查询:
SELECT bit1,
bit2,
BITAND(bit1, bit2),
BITOR(bit1, bit2),
BITXOR(bit1, bit2)
FROM bits;
+------+------+--------------------+-------------------+--------------------+
| 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;
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;
+------+----------+----------------------------+---------------------------+----------------------------+
| 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;
+------+----------+-----------------------------+----------------------------+-----------------------------+
| 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 |
+------+----------+-----------------------------+----------------------------+-----------------------------+