字符串中每个相邻字符的Oracle sql大小写转换

字符串中每个相邻字符的Oracle sql大小写转换,sql,oracle,Sql,Oracle,如果条件类似,则从a到z的两个相邻字符不应在同一情况下; 我需要将helloworld更改为helloworld,并使用如下查询: SELECT listagg(jumping_char,'') WITHIN GROUP(ORDER BY rn) jumped_word FROM (SELECT rn, CASE WHEN mod(rn, 2) = 1 THEN upper(split_word)

如果条件类似,则从a到z的两个相邻字符不应在同一情况下; 我需要将helloworld更改为helloworld,并使用如下查询:

SELECT listagg(jumping_char,'') WITHIN GROUP(ORDER BY rn) jumped_word
FROM
     (SELECT rn,
          CASE
               WHEN mod(rn, 2) = 1
               THEN upper(split_word)
               ELSE lower(split_word)
          END jumping_char
     FROM
          (SELECT regexp_substr('helloworld','.',LEVEL)split_word,
               ROWNUM rn
          FROM dual
               CONNECT BY LEVEL <= LENGTH('helloworld')
          )
     );
现在我得到了一个像hello2world应该变成hello2world的字符串。
任何简单的、不同的查询都将受到感谢。

如果我理解正确,您希望跳过输入中的非字符。您可以通过使用偏移量为rn的regexp_count而不是在旧解决方案中简单地使用rn来实现这一点:

SELECT listagg(jumping_char,'') WITHIN GROUP(ORDER BY rn) jumped_word
FROM
     (SELECT rn,
          CASE
               when mod (regexp_count('hello2world', '[a-zA-Z]', rn), 2) = 1
               THEN upper(split_word)
               ELSE lower(split_word)
          END jumping_char
     FROM
          (SELECT regexp_substr('hello2world','.',LEVEL)split_word,
               ROWNUM rn
          FROM dual
               CONNECT BY LEVEL <= LENGTH('hello2world')
          )
     );

很好,谢谢你提供了正确的方法,还有其他捷径吗?我想你也可以使用MODEL子句-我会尝试使用它来找到一个替代方法。让Oracle学习上面的两种方法来创建一个新的字符转换函数:我会花很少的时间来学习新的函数。感谢并感谢您的宝贵尝试。
with t as 
  (select 'hello2world' txt from dual)
select listagg(case 
                 when mod(v2.char_cnt, 2) = 1 
                 then upper(v2.txt) 
                 else lower(v2.txt) 
               end, 
               '') within group(order by v2.rn)
from (
  select 
    v1.txt, 
    rownum as rn, 
    sum(case 
          when regexp_like(txt, '[a-zA-Z]') 
          then 1 
          else 0 
        end) over (partition by 1 order by rownum) as char_cnt
  from (
    SELECT TXT   
    FROM T
    MODEL
      RETURN UPDATED ROWS
      PARTITION BY(ROWNUM RN)
      DIMENSION BY (0 POSITION)
      MEASURES     (TXT ,length(txt) NB_MOT)
      RULES 
        (TXT[FOR POSITION FROM  1 TO NB_MOT[0] INCREMENT 1] = 
          substr(txt[0], CV(POSITION), 1)  )
   ) v1      
) v2