PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL:konwertuj ciąg szesnastkowy o bardzo dużej liczbie na NUMERYCZNĄ

To jest rodzaj brutalnej siły i wcale nie kuloodporne:

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

Lub, jeśli masz zainstalowany PL/Perl, możesz pozwolić mu wykonać ciężkie podnoszenie:

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

Nie sądzę, że ten inny niż Perl działa z liczbami ujemnymi i jestem całkiem pewien, że obie dadzą złe wyniki, jeśli wprowadzisz wartość inną niż szesnastkowa, ale byłyby to wystarczająco łatwe scenariusze do pułapki i obsługi, w zależności od na temat tego, co funkcja ma robić.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać RETURNING z ON CONFLICT w PostgreSQL?

  2. Jak utworzyć pojedynczy punkt końcowy dla konfiguracji replikacji PostgreSQL za pomocą HAProxy?

  3. Nieskończona pętla w funkcji wyzwalania

  4. Nieprawidłowe sortowanie PostgreSQL

  5. jak parsować json za pomocą json_populate_recordset w postgresie