PostgreSQL中聚合函数bit_xor的用法解析及示例疑问解答
PostgreSQL中
bit_xor聚合函数解析及示例差异说明 一、bit_xor基础用法
PostgreSQL的bit_xor是聚合/窗口函数,核心逻辑是对所有非空输入的二进制值执行按位异或运算:
- 按位异或规则:对应二进制位上的值相同则结果为0,不同则为1(
0^0=0,1^1=0,0^1=1,1^0=1) - 作为聚合函数时,它会计算一组数据中所有值的异或总和;作为窗口函数使用
over()(无分区条件)时,会对整个数据集计算异或结果,并将该结果返回给每一行。
官方手册说明:
bit_xor
计算所有非空输入值的按位异或。可用作无序值集合的校验和。
二、示例解析
示例1:4个值的异或计算
对应的SQL代码:
with cte as ( select 1::bit(4) union select 3::bit(4) union select 7::bit(4) union select 5::bit(4) ) select *,bit_xor(bit) over() from cte;
返回结果:
bit | bit_xor ------+--------- 0001 | 0000 0011 | 0000 0101 | 0000 0111 | 0000 (4 rows)
计算过程:
将四个值按二进制展开后逐步异或:
0001 ^ 0011 = 00100010 ^ 0111 = 01010101 ^ 0101 = 0000
最终所有值异或的结果为0000,因此每一行的bit_xor列都显示该结果。
示例2:3个值的异或计算
对应的SQL代码:
with cte as ( select 1::bit(4) union select 3::bit(4) union select 7::bit(4) ) select *,bit_xor(bit) over() from cte;
返回结果:
bit | bit_xor ------+--------- 0001 | 0101 0011 | 0101 0111 | 0101 (3 rows)
计算过程:
展开二进制逐步计算:
0001 ^ 0011 = 00100010 ^ 0111 = 0101
最终异或结果为0101,因此每一行的bit_xor列都显示该结果。
三、结果差异原因
两个示例的核心差异是参与计算的值数量不同:
- 示例1多了值
5(二进制0101),而前三个值异或的结果恰好是0101,相同值异或会抵消为0,因此最终得到0000。 - 示例2只有三个值,异或过程没有额外的相同值抵消,所以结果为
0101。
内容的提问来源于stack exchange,提问作者jian
相关产品推荐
相关产品推荐

