PostgreSQL自定义函数实现十六进制转十进制

541 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路


在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)

参考链接:
stackoverflow.com/questions/8…