相当于 Postgresql 中 Oracle 的 UTL_RAW.BIT_OR
Equivalent of UTL_RAW.BIT_OR of Oracle in Postgresql
select utl_raw.bit_or('32','3') from dual;
Result : 33
我想知道如何在 postgresql 中获得类似的输出。请帮忙
没有内置函数。
用您选择的过程语言编写它应该不会太难。对于 PL/pgSQL,您可以使用 get_byte()
和 set_byte()
函数。
utl_raw.bit()
显然使用十六进制值。
Postgres 只支持 bit strings 上的位操作,这意味着这些十六进制输入值需要转换为位字符串,然后才能使用内置函数。
基于Erwin's answer将十六进制转换为位,可以这样做:
select (x'32'::bit(8) | x'03'::bit(8));
这个returns
00110011
注意第二个值的前导 0
。 x'3'::bit(8)
将 return 00110000
但如果使用前导 0
,则转换为位串会导致 00000011
。有关详细信息,请参阅链接的答案。
要得到一个十六进制数,我们必须先把它转换成一个整数,然后我们可以在上面使用to_hex()
:
select to_hex((x'32'::bit(8) | x'03'::bit(8))::int)
returns 33
select utl_raw.bit_or('32','3') from dual;
Result : 33
我想知道如何在 postgresql 中获得类似的输出。请帮忙
没有内置函数。
用您选择的过程语言编写它应该不会太难。对于 PL/pgSQL,您可以使用 get_byte()
和 set_byte()
函数。
utl_raw.bit()
显然使用十六进制值。
Postgres 只支持 bit strings 上的位操作,这意味着这些十六进制输入值需要转换为位字符串,然后才能使用内置函数。
基于Erwin's answer将十六进制转换为位,可以这样做:
select (x'32'::bit(8) | x'03'::bit(8));
这个returns
00110011
注意第二个值的前导 0
。 x'3'::bit(8)
将 return 00110000
但如果使用前导 0
,则转换为位串会导致 00000011
。有关详细信息,请参阅链接的答案。
要得到一个十六进制数,我们必须先把它转换成一个整数,然后我们可以在上面使用to_hex()
:
select to_hex((x'32'::bit(8) | x'03'::bit(8))::int)
returns 33