本文已参与「新人创作礼」活动,一起开启掘金创作之路
在PostgreSQL我们可以直接通过下面的方式来将十六进制转换成十进制:
bill@bill=>select x'ab'::int;
int4
------
171
(1 row)
但是这仅仅只能针对某个固定的字符串,如果是下面这种情况就没办法直接转换了:
bill@bill=>select x(substring('abcd',1,2))::int;
ERROR: function x(text) does not exist
LINE 1: select x(substring('abcd',1,2))::int;
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
这种情况我们可以通过UDF函数来实现:
CREATE OR REPLACE FUNCTION hex_to_int(hexval varchar) RETURNS bigint AS $$
DECLARE
result bigint;
BEGIN
EXECUTE 'SELECT x' || quote_literal(hexval) || '::bigint' INTO result;
RETURN result;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
使用该UDF便可以将字符串函数作为参数了:
bill@bill=>select hex_to_int(substring('abcd',1,2));
hex_to_int
------------
171
(1 row)