スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PostgreSQLで16進数文字列を数字に変換

PostgreSQLに数字を16進数文字列に変換する組み込み関数はto_hexです。

select to_hex(65535);
結果:ffff

でこの逆関数が欲しいのですが・・・あれ、無いの?
リテラルなら

select X'ffff'::int;
結果:65535

で、うまくいくようなのですが、カラムに「UFFFF」みたいに入ってて、substringした結果などは適用できません。たぶん組み込みであると思うんですが検索できなかったので、plpgsqlで自作しました。
-- 16進数文字列から数字に変換する関数
CREATE OR REPLACE FUNCTION to_int_from_hex(p_hex text)
RETURNS integer AS $$
DECLARE
    w_hex text;
    w_result int := 0;
    w_length int;
    w_base text := '0123456789ABCDEF';
    w_index int;
BEGIN
    -- 入力チェック
    IF p_hex is null or p_hex = '' THEN
        RETURN null;
    END IF;
   
    -- 長さ取得
    w_length := char_length(p_hex);

    -- 大文字化
    w_hex := upper(p_hex);
  
    -- 一文字づつ変換
    FOR i IN 1..w_length LOOP
        w_index := position(substring(w_hex, i, 1) in w_base);
        IF 0 = w_index THEN
            RETURN null;
        END IF;
        w_result := w_result * 16 + w_index - 1;
    END LOOP;
    RETURN w_result;
END;
$$ LANGUAGE plpgsql;

これを使うと、こんな感じになります。

select to_int_from_hex(substring('UFFFF', 2, 4));
結果:65535

もし、組み込み関数でできる方法を知ってる人がいましたら、教えてください。
スポンサーサイト

Tag : PostgreSQL

COMMENTS

No title

select decode('a','hex');
でいかがでしょう。

No title

なるほど、バイナリとの変換するわけですね。
octed_lengthで桁数取得して、get_byteで値をとって掛け算すればでますね。

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。