다음과 같이 java를 사용하여 문자열 변환을 수행하고 있습니다.SQL을 사용하여 Long 값을 String으로 변환하는 방법
Long longValue = 367L;
String str = Long.toString(longValue, 36).toUpperCase();
이 값은 나를 값 A7로 반환합니다. 오라클 SQL을 수행 할 때 어떻게 이것을 달성 할 수 있습니까?
업데이트 :
안녕, 나는 자바 코드는 다음 노력하는 과정에서 같은 일을 구현하고 싶었 방법을 분석 하였다.
첫 번째 포인트는 입력 신호입니다. LONG과 기수. 내 경우 기수는 36입니다. 그래서 1..9A ... Z0의 값을 갖습니다.이 세트에서만 값을 가져옵니다. 두 번째 점 입력 값으로 긴 값. 이 값을 기수로 나눠야합니다. 지수가 36 이상이면 다시 나누어야합니다.
eaxmple 367의 경우 변환 된 값은 A7 인 10 (상수) 7 (나머지)입니다. 변환 된 3672 값은 102입니다. 102에 대해 다시해야하기 때문에 2-6입니다. 따라서 최종 값은 2-6 0이 될 것이므로 2U0입니다. -는 순서를 뒤집습니다.
업데이트 2 :
오라클 내장 함수를 사용하여이를 수행 할 수 있습니다. 이것은 내 친구에 의해 해결되었고 나에게 기능을 주었다. 나는 내 친구에게 감사하고 싶다. 이것은 나에게 다음과 같이 나올 것이다.
367 그러면 변환 한 값은 10 (상수) 7 (나머지) * A * 7입니다. (필자의 요구 사항에 맞게 수정했습니다.)
FUNCTION ENCODE_STRING(BASE_STRING IN VARCHAR2,
FROM_BASE IN NUMBER,
TO_BASE IN NUMBER)
RETURN VARCHAR2
IS
V_ENCODED_STRING VARCHAR(100);
BEGIN
WITH N1 AS (
SELECT SUM((CASE
WHEN C BETWEEN '0' AND '9'
THEN TO_NUMBER(C)
ELSE
ASCII(C) - ASCII('A') + 10
END) * POWER(FROM_BASE, LEN - RN)
) AS THE_NUM
FROM (SELECT SUBSTR(BASE_STRING, ROWNUM, 1) C, LENGTH(BASE_STRING) LEN, ROWNUM RN
FROM DUAL
CONNECT BY ROWNUM <= LENGTH(BASE_STRING))
),
N2 AS (
SELECT (CASE
WHEN N < 10
THEN TO_CHAR(N)
ELSE CHR(ASCII('A') + N - 10)
END) AS DIGI, RN
FROM (SELECT MOD(TRUNC(THE_NUM/POWER(TO_BASE, ROWNUM - 1)), TO_BASE) N, ROWNUM RN
FROM N1
CONNECT BY ROWNUM <= TRUNC(LOG(TO_BASE, THE_NUM)) + 1)
)
SELECT SYS_CONNECT_BY_PATH(DIGI, '*') INTO V_ENCODED_STRING
FROM N2
WHERE RN = 1
START WITH RN = (SELECT MAX(RN) FROM N2)
CONNECT BY RN = PRIOR RN - 1;
RETURN V_ENCODED_STRING;
plsql에서 변환을 수행해야하는 이유가 있습니까? 일반적으로 데이터를 기본 데이터 형식으로 데이터베이스에 보관하고 상위 수준 (이상적으로는 사용자에게 표시되기 직전)의 서식 지정 * 문제를 처리하는 것이 더 좋습니다 ( –
예). 위의 코드는 시퀀스 ID를 생성합니다. 이제 우리는 일괄 처리를 위해 자바에서 수행하는 것과 동일한 작업을 수행하는 프로 시저를 작성하고 있습니다.그래서 sql과 동등한 가치를 원했습니다. 그것이 가능합니다. – user1268890
나는 [이 페이지는 OraQA의 Frank Zhou가 작성한] SQL을 취할 수있는 사람보다 더 용기있는 사람이다. (http://oraqa.com/2008/02/29/how-to-convert-decimal-base-ten-number- to-binaryoctalhex-in-sql /)을 수정하고 base-36 변환을 수행하도록 수정하십시오. 그러나 경고를 받으십시오. 이것은 희미한 마음을위한 일이 아닙니다. –