2017-04-11 10 views
0

SAP HANAで1つのビューを作成する作業を進めています。HANA:10進数のTHRUシステムの定義済み関数へ

私は列Aを持っていますが、Aのデータ型はNVARCHARです。

Aの値は次のとおりです。私は最後の5桁だけを使用して10進数に変換する必要があります。
000000000000000000000000000EF80A 000000000000000000000000000EF812 000000000000000000000000000EF80E 000000000000000000000000000EF809 000000000000000000000000000EF80B 000000000000000000000000000EF80C 000000000000000000000000000EF80D

Iは、ダミーの関数を使用

選択HEXTOBIN(0xEF80A)を作っ。これは私に必要な結果をもたらしました。

ただし、上記のクエリの0xは、数字(EF80A)を16進数としてマークする表記です。

最後の5桁を動的にフェッチする必要があるときはいつも、私は0x表記を割り当てることができません。

私は以下を試しました: 1)substr最後の5桁のAと0xとの連結。..これはうまくいきませんでした。 '0x'として はストリングと見なされますが、これは単なる表記です。

「0x」を選択||ダミーからの右(A、5)。

カラムAの最後の5文字に0xを付けて16進数にする方法を教えてもらえますか?

ユーザー定義関数なしでこの変換に使用できる直接関数はありますか?

答えて

0

16進数の表記0x...と、文字列のX'...'は、型付きリテラルでのみ有効です。 など。 0xEF80Aは、リテラルに16進表記で与えられた数字を明示的に入力します。内部的には、あたかも整数を与えたかのように扱われます。
これを既存の文字列に適用するには、16進数の文字列変換機能が必要です。また、SAP HANAには1つが付属していません。私はそれが簡単にするためにここにhttps://archive.sap.com/discussions/thread/3652555

を、このような関数の実装例を掲載しました

は、ここでは、再びです:

drop function hexstr2int; 
CREATE FUNCTION hexstr2int (IN i_hex VARCHAR(2000)) 
RETURNS o_result BIGINT 
LANGUAGE SQLSCRIPT 
SQL SECURITY INVOKER 
READS SQL DATA 
AS 
BEGIN 
    DECLARE pos INTEGER := 1; 
    DECLARE hex_len INTEGER; 
    DECLARE current_digit VARCHAR(1); 
    DECLARE current_val INTEGER; 
    DECLARE result BIGINT := 0; 
    DECLARE tmphex VARCHAR(2000); 

    DECLARE hexstr2int CONDITION FOR SQL_ERROR_CODE 10001; 
    DECLARE EXIT HANDLER FOR hexstr2int RESIGNAL; 
    -- some sanitation 
    tmphex := UPPER(:i_hex); 
    hex_len := LENGTH(:tmphex); 
    WHILE :pos <= :hex_len DO 
     result := :result * 16; 
     current_digit := SUBSTR(:tmphex, :pos, 1); 
     -- format checking 
     IF NOT ((:current_digit >= 'A' and :current_digit <= 'F') or 
        (:current_digit >= '0' and :current_digit <= '9')) THEN 
      SIGNAL hexstr2int SET MESSAGE_TEXT = 
       'Invalid hex cipher: ' || :current_digit || ' at position ' || :pos; 
     END IF; 
     current_val := MOD(to_number(to_binary(:current_digit)),30); 
     IF :current_val >= 11 THEN 
      result := :result + :current_val - 1; 
     ELSE 
      result := :result + :current_val; 
     END IF; 
     pos := :pos + 1; 
    END WHILE; 
    o_result := :result; 
END; 
関連する問題