3

PostgreSQL で理解できた限りでは、hex または bit から 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 に unsigned smallint がないため、直接 int2 (範囲外の smallint) にキャストできません。

また、PostgreSQLではできません

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

PostgreSQLでこれを行う方法はありますか、それとも自分でint4をint2に変換する必要がありますか(ビットを考慮して)?

4

1 に答える 1

6

次の式は、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
于 2013-04-23T21:13:43.003 に答える