gpt4 book ai didi

sql - PostgreSQL:位到smallint

转载 作者:行者123 更新时间:2023-12-02 21:12:07 26 4
gpt4 key购买 nike

据我所知,在 PostgreSQL 中,你无法从十六进制或位转换为smallint,或者反之亦然。

要将 int2 转换为 bit16,可以执行以下操作:

select ((((-32768)::int2)::int4)::bit(32)<<16)::bit(16)
Result: 1000000000000000

但是我们怎样才能反过来呢?

我有一个 int2 标志,我想在其中设置最高位。但由于我不能对 int2 使用位运算,所以我必须先将其转换为 int4,所以我可以这样做。像这样的事情:

SELECT flags, 
(flags | x'8000'::integer) myInt2Result
FROM MyTable;

然后我将使用 myInt2Result 来调用其他进程。为了使其更容易尝试,让我们假设 flags 是一个值为 2560 的smallint:

SELECT 2560::int2, (2560::int2 | x'8000'::integer)
RESULT: 35328

由于这个值大于+32767,并且我在 PostgreSQL 中没有无符号的smallint,所以我无法将其直接转换为int2(smallint 超出范围)。

另外:在 PostgreSQL 中我们不能这样做

x'8000'::int2 (it would be really handy) 
OR
x'8000'::integer::int2 (smallint out of range)

有没有办法在 PostgreSQL 中做到这一点,或者我必须自己将 int4 转换为 int2 (考虑到位)?

最佳答案

以下表达式在 PostgreSQL 9.1 中适用于我:

select ((-32768)::int2)::int4::bit(16);
==> X'8000'

select ((('X8000'::bit(16))::bit(32)::int4) >> 16)::int2;
==> -32768

编辑:一些证据表明这有效:

-- int2 to bit16 and back
create temp table test1 (x int2);
insert into test1 select generate_series(-32768,32767)::int2;
select x from test1 where x != ((x::int4::bit(16) ::bit(32)::int4) >> 16)::int2;
==> no rows selected

-- bit16 to int2 and back
create temp table test2 (x bit(16));
insert into test2 select generate_series(0,65536)::bit(16);
select x from test2 where x != (((x::bit(32)::int4)>>16)::int2) ::int4::bit(16);
==> no rows selected

关于sql - PostgreSQL:位到smallint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16097659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com