sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL:非常に大きな数値の16進文字列をNUMERICに変換します

    これは一種のブルートフォースであり、防弾ではありません:

    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のものは負の数で機能するとは思いません。また、非16進値を入力すると、どちらも悪い結果をもたらすと確信していますが、状況によっては、これらはトラップして処理するのに十分簡単なシナリオです。関数に何をさせたいかについて。



    1. MySQLデータ型の概要

    2. intellijideaでJDBC/Mysqlコネクタを使用する

    3. SQL ServerでFILEPROPERTY()を使用する方法

    4. 1つの列からページをグループ化する