PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL:преобразува шестнадесетичен низ от много голямо число в ЧИСЛО

Това е нещо като груба сила и изобщо не е бронирано:

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

Или, ако имате инсталиран PL/Perl, можете да го оставите да свърши тежката работа:

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

Не мисля, че този, който не е Perl, работи с отрицателни числа и съм напълно сигурен, че и двата ще ви дадат лоши резултати, ако поставите не-шестнадесетична стойност, но това биха били достатъчно лесни сценарии за улавяне и обработка, в зависимост какво искате да прави функцията.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изтрия стойност на тип enum в postgres?

  2. Автоматизиране на ежедневните задачи на PostgreSQL с помощта на Jenkins

  3. Намалете досадните известия в plpgsql

  4. C# и PostgreSQL

  5. RangeError за просто целочислено присвояване в Rails 4.2.0, което трябва да бъде уловено от валидиране