如何使用 sql 将 Long 值转换为 String

Posted

技术标签:

【中文标题】如何使用 sql 将 Long 值转换为 String【英文标题】:How to convert the Long value to String using sql 【发布时间】:2013-06-20 06:15:12 【问题描述】:

我正在通过以下方式使用 java 进行长字符串转换。

Long longValue = 367L;
String str = Long.toString(longValue, 36).toUpperCase();

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

更新:

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

第一点是输入值。长和基数。在我的情况下,基数是 36。所以我将有 1..9A...Z0 的值它只从这个集合中获取值。 第二点 Long 值作为输入。我们必须将此值除以基数。如果商再次大于 36,我们需要除以。

对于 eaxmple 367,我的转换值为 10(商)7(余数),即 A7。 3672 转换后的值是 102 0 我需要对 2 -6 的 102 再做一次,所以我的最终值将是 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 中进行转换吗?通常最好将数据以其本机数据类型保存在数据库中,并在更高级别处理格式化问题(最好是在立即呈现给用户之前) 是的。上面的代码将生成一个序列 id。现在我正在编写程序来做我们在java中为批处理做的同样的事情。这就是为什么我想在 sql 中具有同等价值的原因。有没有可能。 比我更有勇气从this page by Frank Zhou at OraQA 获取 SQL 并对其进行修改以进行 base-36 转换的人。但请注意 - 这不是胆小的人的任务...... 感谢 Pugal 提供您的代码。 【参考方案1】:

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

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

【讨论】:

我没有看到任何选项可以为转换指定 10 以外的基数。 Java 转换正在获取 base-36 表示。【参考方案2】:

在纯 SQL 中是不可能做到的。你必须使用 PL/SQL。

PL/SQL 的简单示例:

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 数据库 PL/SQL 包和类型参考)

【讨论】:

谢谢你,我想你误解了我的问题或者我的问题是错误的。我开始明白我必须编写自己的函数,这正是 toString 所做的。 毕竟是Java,肯定有库。 @the_slk:请阅读 Oracle 中的 LONG 数据类型。它与 Java 中的同名数据类型没有任何相似之处,它是一种文本数据类型,旨在保存可变长度的大型对象数据(类似于 CLOB)。它的使用已被弃用多年。 @Bob Jarvis:我知道。这就是为什么 Java 应该包含一些库来处理它。

以上是关于如何使用 sql 将 Long 值转换为 String的主要内容,如果未能解决你的问题,请参考以下文章

如何将Long值转换为日期时间并将当前时间转换为Long kotlin?

如何在聚合之前将值转换为 long?

在 Spark SQL 中将 long 类型的列转换为 calendarinterval 类型

如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;

将 x,y 像素值转换为 lat 和 long

python解析excel,如何将long转换为字符串? [复制]