PostgreSQL:将非常大数字的十六进制字符串转换为NUMERIC

PostgreSQL:将非常大数字的十六进制字符串转换为NUMERIC,第1张

概述我试图转换一个非常大的十六进制字符串 到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 r 我试图转换一个非常大的十六进制字符串
到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
解决方法 这是一种蛮力而且根本不防d:

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可以使用负数,而且我很确定如果你输入一个非十六进制值,两者都会给你带来不好的结果,但这些方法很容易陷阱和处理,具体取决于在你想要的功能上做什么.

总结

以上是内存溢出为你收集整理的PostgreSQL:将非常大数字的十六进制字符串转换为NUMERIC全部内容,希望文章能够帮你解决PostgreSQL:将非常大数字的十六进制字符串转换为NUMERIC所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1161454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存