C'est une sorte de force brute et pas du tout à l'épreuve des balles :
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
Ou, si vous avez installé PL/Perl, vous pouvez le laisser faire le gros du travail :
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
Je ne pense pas que le non-Perl fonctionne avec des nombres négatifs, et je suis sûr que les deux vous donneront de mauvais résultats si vous mettez une valeur non hexadécimale, mais ce seraient des scénarios assez faciles à piéger et à gérer, selon sur ce que vous voulez que la fonction fasse.