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

PostgreSQL中是否有等效于Oracle BITAND()的函数?需解码BIT_AND结果

在PostgreSQL中提取二进制位(替代Oracle的BITAND+DECODE写法)

我懂你要做的事——从数值里把指定位置的二进制位解码成0或1的标记,而不是做BIT_AND那种聚合运算对吧?你在Oracle里用BITAND结合DECODE和NVL的写法,在PostgreSQL里可以用更简洁的原生位操作符实现完全一样的效果。

先回顾下你的Oracle代码逻辑:你通过BITAND(bar, POWER(2, n))检查第n位是否被设置,如果结果等于POWER(2, n)就返回1,否则返回0。在PostgreSQL里,我们可以用标准的位操作符直接实现:

等价的PostgreSQL实现(CASE语句版)

SELECT
  -- 提取第1位(对应2^1=2的位置)
  CASE WHEN (bar & (2 ^ 1)) <> 0 THEN 1 ELSE 0 END AS first_bit,
  -- 提取第2位(对应2^2=4的位置)
  CASE WHEN (bar & (2 ^ 2)) <> 0 THEN 1 ELSE 0 END AS second_bit
FROM (
  SELECT 1234 AS bar
  UNION ALL
  SELECT 12345 AS bar
) foo;

更简洁的位移操作版

PostgreSQL支持>>(右移)操作符,我们可以把目标位移到最右边,再和1按位与,直接得到0或1,连CASE都省了:

SELECT
  -- 右移1位后取最低位,对应原数值的第1位(2^1)
  ((bar >> 1) & 1) AS first_bit,
  -- 右移2位后取最低位,对应原数值的第2位(2^2)
  ((bar >> 2) & 1) AS second_bit
FROM (
  SELECT 1234 AS bar
  UNION ALL
  SELECT 12345 AS bar
) foo;

关键说明

  • PostgreSQL的&是按位与操作符,和Oracle的BITAND功能完全一致;
  • >> n表示把数值右移n位,这样目标位就会变成最低位,再和1按位与就能直接得到该位的0/1值;
  • 不需要用NVL,因为位运算的结果只会是0或1,不会出现NULL;
  • 如果你的位计数是从0开始(比如最右边的第一位是第0位),只需要调整位移的数字即可,比如提取第0位用(bar & 1)或者((bar >> 0) & 1)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:21:19