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
相关产品推荐
相关产品推荐

