You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

计算过程:
将四个值按二进制展开后逐步异或:

  1. 0001 ^ 0011 = 0010
  2. 0010 ^ 0111 = 0101
  3. 0101 ^ 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)

计算过程:
展开二进制逐步计算:

  1. 0001 ^ 0011 = 0010
  2. 0010 ^ 0111 = 0101
    最终异或结果为0101,因此每一行的bit_xor列都显示该结果。

三、结果差异原因

两个示例的核心差异是参与计算的值数量不同:

  • 示例1多了值5(二进制0101),而前三个值异或的结果恰好是0101,相同值异或会抵消为0,因此最终得到0000。
  • 示例2只有三个值,异或过程没有额外的相同值抵消,所以结果为0101。

内容的提问来源于stack exchange,提问作者jian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:20:26