Đây là một loại vũ lực và hoàn toàn không chống đạn:
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
Hoặc, nếu bạn đã cài đặt PL / Perl, bạn có thể để nó thực hiện công việc nặng nhọc:
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
Tôi không nghĩ giá trị không phải Perl hoạt động với số âm và tôi khá chắc chắn rằng cả hai sẽ cho bạn kết quả xấu nếu bạn đặt giá trị không phải là hex, nhưng đó sẽ là những tình huống đủ dễ để mắc bẫy và xử lý, tùy thuộc vào về những gì bạn muốn hàm thực hiện.