在Postgres中是否有相当于Oracle的BITAND()函数?

时间:2018-03-30 21:06:41

标签: sql oracle postgresql

我知道有一个Postgres函数BIT_AND(),这不是一回事 - 实际上它与我的最终目标相反。我希望能够将像Postgres BIT_AND()这样的操作的结果解码回原始位。我有在Oracle中执行此操作的代码,如下所示:

<!-- HTML -->

<div id="my-canvas-container">
  <!-- this is where your canvas would load -->
</div>



/* CSS */

html, body {
  padding: 0;
  margin: 0;
}

#my-canvas-container {
  min-width:100%
}

如果foo.bar的第一位设置,first_bit将返回1,否则为0,等等。我可以将所有内容翻译为Postgres,除了BITAND(),我发现在网上讨论这个问题的唯一方法就是一个帖子在forums.devshed.com上从2010年开始零回复 - 欣赏任何见解。

编辑:下面回答,谢谢!以下是我需要做的调整以使其工作,所有这些都是因为我实际上处理了多达43个编码为位的选项,我真的希望能够使用power()函数来制作很清楚我要去哪一点,所以我不得不转换数据类型。

select NVL(DECODE(BITAND(foo.bar, POWER (2, 1)), POWER (2, 1), 1), 0) first_bit,
NVL(DECODE(BITAND(foo.bar, POWER (2, 2)), POWER (2, 2), 1), 0)  second_bit
from 
(select 1234 bar from dual
union select 12345 bar from dual) foo

1 个答案:

答案 0 :(得分:1)

在Postgres中,按位和运算符为&

你似乎想要这样的东西:

select ((foo.bar & 2) > 0)::int as first_bit,
       ((foo.bar & 4) > 0)::int as second_bit
from (select 1234 as bar union all
      select 12345
     ) foo;

我不确定为什么要计算第二个位,但操作符与Oracle函数的作用相同。

Here是一个更好地说明运算符的SQL小提琴。