字符串中每个相邻字符的Oracle sql大小写转换
如果条件类似,则从a到z的两个相邻字符不应在同一情况下; 我需要将helloworld更改为helloworld,并使用如下查询:字符串中每个相邻字符的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)
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