gpt4 book ai didi

postgresql - 将长 Postgres bytea 转换为十进制

转载 作者:行者123 更新时间:2023-11-29 11:47:12 33 4
gpt4 key购买 nike

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

c30d040703020095dbb3d3746d096dd23b01c59bcbc7a4320f571511f61f3ea3def0e55404204a274500224927421bd5a8344a56316b909ef3af276b585622f1c9b7ca13563ee6fe88f4ddbe

问题不在于similar questions处理那么大的数字。谁有解决办法?

最佳答案

这是我的看法:

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;

它使用二进制拆分,即将输入分成两半并通过递归调用自身进行转换,然后将两部分组合起来。

编辑:我只是运行一个简单的基准测试来比较上面的函数与the one linked通过阿贝利斯托:

$ EXPLAIN ANALYZE SELECT parse_hex(n||'c30d040703020095dbb3d3746d096dd23b01c59bcbc7a4320f571511f61f3ea3def0e55404204a274500224927421bd5a8344a56316b909ef3af276b585622f1c9b7ca13563ee6fe88f4ddbe') FROM generate_series(1,1000) s(n);
Execution time: 640.031 ms

而对于 hex2dec 我得到

Execution time: 2354.616 ms

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

关于postgresql - 将长 Postgres bytea 转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498558/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com