到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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)