如何在不使用reverse()函数的情况下在Oracle(11g)SQL中反转字符串

如何在不使用reverse()函数的情况下在Oracle(11g)SQL中反转字符串,oracle,oracle11g,Oracle,Oracle11g,我试图在不使用反转函数的情况下反转字符串。我遇到了一个类似的例子: select listagg(letter) within group(order by lvl) from (SELECT LEVEL lvl, SUBSTR ('hello', LEVEL*-1, 1) letter FROM dual CONNECT BY LEVEL <= length('hello')); 除此之外,还有其他更好的方法吗 您可以尝试使用此功能: SQL> ed Wrote

我试图在不使用反转函数的情况下反转字符串。我遇到了一个类似的例子:

select listagg(letter) within group(order by lvl)
from 
 (SELECT LEVEL lvl, SUBSTR ('hello', LEVEL*-1, 1) letter 
 FROM   dual 
 CONNECT BY LEVEL <= length('hello'));

除此之外,还有其他更好的方法吗

您可以尝试使用此功能:

SQL> ed
Wrote file afiedt.buf

  1  with t as (select 'Reverse' as txt from dual)
  2  select replace(sys_connect_by_path(ch,'|'),'|') as reversed_string
  3  from (
  4        select length(txt)-rownum as rn, substr(txt,rownum,1) ch
  5        from t
  6        connect by rownum <= length(txt)
  7       )
  8  where connect_by_isleaf = 1
  9  connect by rn = prior rn + 1
 10* start with rn = 0
SQL> /

你可以这样做:

with strings as (select 'hello' str from dual union all
                 select 'fred' str from dual union all
                 select 'this is a sentance.' from dual)
select str,
       replace(sys_connect_by_path(substr (str, level*-1, 1), '~|'), '~|') rev_str 
from   strings
where  connect_by_isleaf = 1
connect by prior str = str                  --added because of running against several strings at once
           and prior sys_guid() is not null --added because of running against several strings at once 
           and level <= length(str);

STR                 REV_STR             
------------------- --------------------
fred                derf                
hello               olleh               
this is a sentance. .ecnatnes a si siht 

注意,我使用了~|分隔符只是因为它不太可能是字符串的一部分。您需要为sys\u connect\u by\u路径提供一个非空分隔符,因此我没有将其保留为空

如果您试图避免使用未记录的反转功能,您可以使用,也可以使用适当的转换和原始转换:

select utl_i18n.raw_to_char(
  utl_raw.reverse(
    utl_i18n.string_to_raw('Some string', 'AL32UTF8')), 'AL32UTF8')
from dual;

UTL_I18N.RAW_TO_CHAR(UTL_RAW.REVERSE(UTL_I18N.STRING_TO_RAW('SOMESTRING','AL32UT
--------------------------------------------------------------------------------
gnirts emoS                                                                     
这就是取原始值;在上面做utl_i18n.string_to_raw;然后将其传递给utl_raw.reverse;然后将结果通过utl_i18n.raw_传回给_char

不完全确定这将如何处理多字节字符,或者您希望在这些字符上发生什么

或不使用字符集处理的变体:

select utl_raw.cast_to_varchar2(utl_raw.reverse(utl_raw.cast_to_raw('Some string')))
from dual;

UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.REVERSE(UTL_RAW.CAST_TO_RAW('SOMESTRING')))   
--------------------------------------------------------------------------------
gnirts emoS                                                                     

但该线程还指出,它只适用于单字节字符。

如何更好地定义?为什么你不想使用反向;因为它没有文档记录?
SELECT LISTAGG(STR) WITHIN GROUP (ORDER BY RN DESC)
FROM 
(
     SELECT ROWNUM RN, SUBSTR('ORACLE',ROWNUM,1) STR FROM DUAL 
     CONNECT BY LEVEL <= LENGTH('ORACLE')
);