PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL :convertir une chaîne hexadécimale d'un très grand nombre en NUMERIC

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.