2

TEXT16 進数を含む列を持つテーブルがあります。私は今、それらを実際の整数として表現する必要がありますが、それを行う方法が見つかりませんでした (to_hex()逆のようなもの)。

次のようにリテラル16 進数値を変換できることを認識しています。

SELECT x'DEADBEEF';

しかし、変換する値が列からのものである場合、どうすればこのようなものを適用できますか? 列名への連結'x'は、文字列リテラルではなくなるため、明らかに機能しません。

PostgreSQL メーリング リストで、関数の引数が再びリテラルになるようにクエリ文字列をつなぎ合わせてからその関数を実行する非常に醜い関数を見つけましたが、そのアプローチは実にひねくれています。仕方。メッセージがほぼ 10 年前のものであることを考えると、少なくともそう願っています…</p>

もちろん、最初に問題の値を整数としてデータベースに格納することが最善の方法であることはわかっています。しかし、この場合、これは不可能なので、それらの文字列を解読しようとして立ち往生しています…)

4

2 に答える 2

1

以下の機能は、メーリングリストのその投稿の機能とほぼ同じです。実際、私はそれらをメーリングリストからも取得しましたが、新しい投稿から取得しました。何も悪いところは見えません。小さなデータセットを移行するときに一度だけ使用しました。

その使用から生じる可能性のある「ひねくれた」ものを指摘できる場合は、遠慮なく反対票を投じてください。

データ型のINTEGER場合:

CREATE OR REPLACE FUNCTION hex_to_int(hexval varchar) RETURNS integer AS $$
DECLARE
  result  int;
BEGIN
EXECUTE 'SELECT x''' || hexval || '''::int' INTO result;
  RETURN result;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;

データ型のBIGINT場合:

CREATE OR REPLACE FUNCTION hex_to_bigint(hexval varchar) RETURNS bigint AS $$
DECLARE
   result  bigint;
BEGIN
EXECUTE 'SELECT x''' || hexval || '''::bigint' INTO result;
 RETURN result;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;
于 2013-01-07T02:58:48.480 に答える
1

うーん、もっと簡単な方法があるかもしれません。

CREATE FUNCTION from_hex(text) RETURNS integer AS $$
DECLARE
    x bytea;
BEGIN
    x := decode($1, 'hex');
    return (get_byte(x, 0) << 24) | (get_byte(x, 1) << 16) |
           (get_byte(x, 2) << 8) | get_byte(x, 3);
END
$$ LANGUAGE plpgsql;

書かれているように、これは 8 桁の 16 進数に対してのみ機能することに注意してください。

于 2013-01-07T02:45:13.880 に答える