PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL:mengonversi string hex dari angka yang sangat besar menjadi NUMERIK

Ini semacam kekerasan dan sama sekali tidak antipeluru:

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

Atau, jika Anda telah menginstal PL/Perl, Anda dapat membiarkannya melakukan pekerjaan berat:

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

Saya tidak berpikir yang non-Perl berfungsi dengan angka negatif, dan saya cukup yakin keduanya akan memberi Anda hasil yang buruk jika Anda memasukkan nilai non-hex, tetapi itu akan menjadi skenario yang cukup mudah untuk dijebak dan ditangani, tergantung tentang apa yang Anda ingin fungsi tersebut lakukan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendefinisikan string multi-baris di psql

  2. Masalah koneksi dengan SQLAlchemy dan beberapa proses

  3. Pencocokan algoritma dalam SQL

  4. Memodelkan tabel database Pengguna, Grup, dan Keanggotaan

  5. Menonaktifkan Pengumpulan Koneksi di Rails untuk menggunakan PgBouncer