2017-04-11 10 views
0

SAP HANA에서 하나의 뷰를 생성하려고합니다.HANA : 십진법의 THRU 시스템에서의 정의 된 기능

저는 A 열을 가지고 있습니다. A의 데이터 형식은 NVARCHAR입니다.

값은 다음과 같습니다. 마지막 5 자리 만 사용하고 10 진수로 변환해야합니다.
000000000000000000000000000EF80A 000000000000000000000000000EF812 000000000000000000000000000EF80E 000000000000000000000000000EF809 000000000000000000000000000EF80B 000000000000000000000000000EF80C 제가

기능을 살린 000000000000000000000000000EF80D

더미로부터

선택 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에는 하나의 문자가 포함되어 있지 않습니다.

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; 
:

여기 https://archive.sap.com/discussions/thread/3652555

이러한 기능에 대한 예제 구현을 게시 한

여기서 다시, 그것은 쉽게 만들려면