我正在用以下方式使用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转换。但要警告 - 这不是一个心灵的任务... –