首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sql将长值转换为字符串

如何使用sql将长值转换为字符串
EN

Stack Overflow用户
提问于 2013-06-20 14:15:12
回答 2查看 17.5K关注 0票数 1

我正在用java做一个从长到字符串的转换,方法如下。

代码语言:javascript
复制
Long longValue = 367L;
String str = Long.toString(longValue, 36).toUpperCase();

这会将我作为value A7返回。如何在做oracle sql时做到这一点。

更新:

嗨,我已经分析了java代码是如何工作的,然后想在procedure中实现同样的事情。

第一点是输入值。LONG and Radix。在我的例子中,基数是36。所以我将有来自1..9A...Z0的值,它只从这个集合中提取值。第二点长值作为输入。我们必须将这个值除以基数。如果商再次大于36,我们需要除法。

对于eaxmple367,我的转换值是10(商)7(余数),这是A7。3672转换后的值是102,我需要对102再做一次,它是2-6,所以我的最终值是2 -6,也就是2U0(-表示颠倒顺序)。

更新2:

使用oracle内置的函数,我们可以做到这一点。这是由我的朋友解决的,并给了我一个功能。我要感谢我的朋友。这将为我提供如下输出。

367然后我的转换值是10(商)7(余数),即*A*7。(我将其修改为我的要求)。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2013-06-20 14:20:21

在PL/SQL (或Oracle SQL)中,有一个名为TO_CHAR的函数。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions181.htm

票数 0
EN

Stack Overflow用户

发布于 2013-06-20 16:15:03

在纯SQL中不可能做到这一点。您必须使用PL/SQL。

简单示例如何操作PL/SQL:

代码语言:javascript
复制
CREATE TABLE long_tbl
(
    long_col LONG
);

INSERT INTO long_tbl VALUES('How to convert the Long value to String using sql');

DECLARE
    l_varchar VARCHAR2(32767);
BEGIN
    SELECT  long_col
    INTO    l_varchar
    FROM    long_tbl;

    DBMS_OUTPUT.PUT_LINE(l_varchar);
END;
-- How to convert the Long value to String using sql

有TO_LOB函数,但只有在向表中插入数据时才能使用。http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions185.htm

只能将此函数应用于LONG或LONG RAW列,并且只能在INSERT语句中子查询的选择列表中应用此函数。

还有其他更合适的方法,使用"dbms_sql.column_value_long“,但这会变得复杂(获取LONG列并附加到CLOB类型)。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm#i1025399

(Oracle Database PL/SQL Packages and Types Reference)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17206495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档