sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:převeďte hexadecimální řetězec velmi velkého čísla na NUMERICKÝ

Toto je druh hrubé síly a vůbec ne neprůstřelné:

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

Nebo, pokud máte nainstalovaný PL/Perl, můžete ho nechat dělat těžkou práci:

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

Nemyslím si, že ten, který není v Perlu, nepracuje se zápornými čísly, a jsem si docela jistý, že oba vám poskytnou špatné výsledky, pokud vložíte nehexadecimální hodnotu, ale tyto scénáře by bylo snadné zachytit a zvládnout v závislosti na podle toho, co chcete, aby funkce dělala.



  1. Jak získat středový bod 2 nebo 3 radiálních poloh (zeměpisná šířka, délka)

  2. Jak odstranit část řetězce v mysql?

  3. Načtení datového listu aplikace Excel do databáze Oracle

  4. Proč je moje připojení MySQLi tak pomalé?