据我在 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 (考虑到这些位)?