PostgreSQL:将非常大数字的十六进制字符串转换为NUMERIC
发布时间:2020-12-13 16:02:40 所属栏目:百科 来源:网络整理
导读:我试图转换一个非常大的十六进制字符串 到NUMERIC列 CREATE OR REPLACE FUNCTION hex_to_int(hexval varchar) RETURNS NUMERIC AS $$DECLARE result NUMERIC;BEGIN EXECUTE 'SELECT x''' || hexval || '''::NUMERIC(40,0)' INTO result; RETURN result;END;$
我试图转换一个非常大的十六进制字符串
到NUMERIC列 CREATE OR REPLACE FUNCTION hex_to_int(hexval varchar) RETURNS NUMERIC AS $$ DECLARE result NUMERIC; BEGIN EXECUTE 'SELECT x''' || hexval || '''::NUMERIC(40,0)' INTO result; RETURN result; END; $$ LANGUAGE 'plpgsql' IMMUTABLE STRICT; 在那里我试图这样做: select hex_to_int(tx.value) from internal_transaction tx 我得到的错误是: [42846] ERROR: cannot cast type bit to numeric Where: PL/pgSQL function hex_to_int(character varying) line 5 at EXECUTE statement 解决方法
这是一种蛮力而且根本不防弹:
CREATE OR REPLACE FUNCTION hex_to_int(hexval varchar) RETURNS numeric AS $$ DECLARE result NUMERIC; i integer; len integer; hexchar varchar; BEGIN result := 0; len := length(hexval); for i in 1..len loop hexchar := substr(hexval,len - i + 1,1); result := result + round(16 ^ (i - 1)::dec * case when hexchar between '0' and '9' then cast (hexchar as int) when upper (hexchar) between 'A' and 'F' then ascii(upper(hexchar)) - 55 end); end loop; RETURN result; END; $$ LANGUAGE 'plpgsql' IMMUTABLE STRICT; select hex_to_int('12AE34F'); -- returns 19587919 或者,如果你安装了PL / Perl,你可以让它做繁重的工作: CREATE OR REPLACE FUNCTION hex_to_int_perl(varchar) RETURNS numeric AS $BODY$ my ($hex) = @_; return sprintf "%d",hex($hex); $BODY$ LANGUAGE plperl VOLATILE COST 100; select hex_to_int_perl('12AE34F'); -- returns 19587919 我不认为非Perl可以使用负数,而且我很确定如果你输入一个非十六进制值,两者都会给你带来不好的结果,但这些方法很容易陷阱和处理,具体取决于在你想要的功能上做什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |