もう 1 つの方法は、hex
表現の最後の 6 文字を抽出し、先頭に を追加しx
て直接キャストすることです。
db=# SELECT ('x' || right('\x00000000000001'::bytea::text, 6))::bit(24)::int;
int4
------
1
get_byte()
.. これはルートよりも少し短いですが、PostgreSQLの文書化されていない機能でもあります。ただし、ここでトム・レーンを引用します。
これは、ビット型入力コンバーターの文書化されていない動作に依存していますが、それが壊れると予想する理由はありません。おそらくより大きな問題は、PG >= 8.3 が必要なことです。これより前にビット キャストするテキストがなかったからです。
この関連する回答の詳細:
これは、バージョン 9.0 以降のデフォルトであるの設定bytea_output
がであることを前提としています。hex
確かに、セッション用にテスト/設定できます。
SET bytea_output = 'hex';
詳細はこちら:
パフォーマンス
10,000 行のテーブルでテスト (ベスト 10) を実行しました。get_byte()
Postgres 9.1 では、実際には少し高速です。
CREATE TEMP TABLE t (a bytea);
INSERT INTO t
SELECT (12345670000000 + generate_series(1,10000))::text::bytea;
ビットシフトは、乗算/加算とほぼ同じくらい高速です。
SELECT
('x' || right(a::text, 6))::bit(24)::int -- 34.9 ms
,(get_byte(a, 11) << 16) + (get_byte(a, 12) << 8) + get_byte(a, 13) -- 27.0 ms
,(get_byte(a, 11) << 16) | (get_byte(a, 12) << 8) | get_byte(a, 13) -- 27.1 ms
, get_byte(a, 11) * 65536 + get_byte(a, 12) * 256 + get_byte(a, 13) -- 27.1 ms
FROM t