Postgresql 将长后缀bytea转换为十进制

Postgresql 将长后缀bytea转换为十进制,postgresql,Postgresql,我有一个Postgresbytea值,我想将其存储为decimal类型(或者存储为带十进制数字的字符串)。它太长,无法存储为bigint,但如果说decimal值最多可以有131072位,这就足够大了。这大约是我需要处理的长度(十六进制中的150-300位): 问题是没有一个句柄的数字那么大。有人有解决办法吗?以下是我的看法: CREATE OR REPLACE FUNCTION parse_hex(s text) RETURNS numeric AS $$ DECLARE len in

我有一个Postgres
bytea
值,我想将其存储为
decimal
类型(或者存储为带十进制数字的字符串)。它太长,无法存储为
bigint
,但如果说
decimal
值最多可以有131072位,这就足够大了。这大约是我需要处理的长度(十六进制中的150-300位):

问题是没有一个句柄的数字那么大。有人有解决办法吗?

以下是我的看法:

CREATE OR REPLACE FUNCTION parse_hex(s text) RETURNS numeric AS $$
DECLARE
    len integer;
    result  bigint;
BEGIN
    SELECT length(s) INTO len;
    IF len <= 15 THEN
        EXECUTE 'SELECT x''' || s || '''::bigint' INTO result;
        RETURN result::numeric;
    ELSE
        RETURN parse_hex(left(s, (len+1)/2)) * (16::numeric)^(len/2) +
               parse_hex(right(s, len/2));
        RETURN 0;
    END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
而对于
hex2dec

Execution time: 2354.616 ms

因此,我的函数更快(对于这种大小的输入),我不知道这主要是因为二进制分割的渐进复杂性更好,还是因为它一次处理15个十六进制数字(而不是1)。

(您需要“能够处理任意长度输入的变体”)看起来很棒!我还在调试我自己的解决方案,所以我会把它扔掉,拿走你的。:-)@PaulAJungwirth和ta dam,
create或replace函数hex2num_p(p_输入文本)返回数值语言plpythonu不可变严格为$$return int(p_输入,16)$$-
执行时间:29.971 ms
(对于相同数据上的
parse_hex
,执行时间:2804.940 ms
),以防我们关心速度:)29 ms更合理,不是吗?向python施压是很可爱的。:-)
$ EXPLAIN ANALYZE SELECT parse_hex(n||'c30d040703020095dbb3d3746d096dd23b01c59bcbc7a4320f571511f61f3ea3def0e55404204a274500224927421bd5a8344a56316b909ef3af276b585622f1c9b7ca13563ee6fe88f4ddbe') FROM generate_series(1,1000) s(n);
Execution time: 640.031 ms
Execution time: 2354.616 ms