我正在用以下方式使用java進行字符串轉換。如何將Long值轉換爲使用sql的字符串
Long longValue = 367L;
String str = Long.toString(longValue, 36).toUpperCase();
這是返回我作爲值A7。如何才能做到這一點在做oracle的sql。
更新:
嗨,我已經分析了Java代碼工作,然後要在落實過程中的同樣的事情。
第一點是輸入vaues。長和基數。在我的情況下,基數是36.所以我將有從1..9A的值... Z0它只從這個集合中獲取值。 第二點長輸入值。我們必須將這個值與基數分開。如果商數再次超過36,我們需要分開。
對於eaxmple 367,那麼我的轉換值是10(商)7(餘數)是A7。 3672轉換後的值是102 0我需要再次爲102這是2 -6,所以我的最終值將是2-6 0即2U0( - 意味着顛倒順序)。
更新2:
使用建立在函數中的oracle我們可以做到這一點。這是我的朋友解決的,給了我一個功能。我要感謝我的朋友。這會給我一個如下的結果。
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中進行轉換的原因?將數據保存在數據庫中的原始數據類型通常會更好,並且在更高級別處理*格式化問題(理想情況下,在向用戶呈現之前) –
是的。上面的代碼會生成一個序列號。現在我正在編寫過程來做同樣的事情,我們在java中進行批處理。這就是爲什麼我想在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轉換。但要警告 - 這不是一個心靈的任務... –