我认为最好用regexp来完成,因为这可能是最短的方式,但其他任何建议都是好的。
说,我在PL / SQL中有一个字符串,并且如果它的小,则想要将每个第N个字符大写,并且如果它的大小则更低。例如,每五个字母。
我想研究实现这一目标的可能性。
感谢。
答案 0 :(得分:2)
由于星期六晚上我没有更好的事情要做(当然,在Dark Matter之后)我决定挑战我的大脑。所以在得知SQLFiddle坏了之后,我在我的计算机上安装了Oracle 11g R2 Express Edition来解决这个问题......是的,我真的很无聊。
直接来自一张桌子:
drop table test;
create table test (nbr number, txt varChar2(26));
insert into test (nbr, txt) values (1,'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
insert into test (nbr, txt) values (2,'abcdefghijklmnopqrstuvwxyz');
insert into test (nbr, txt) values (3,'ABCDEFGHIJklmnopqrstUVWXYZ');
insert into test (nbr, txt) values (4,'abcdefghijKLMNOPQRSTuvwxyz');
select
nbr,
(
select
listAgg
(
case subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1)
when upper(subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1))
then subStr(subStr(t.txt,((level - 1) * 5) + 1,5),1,4) ||
lower(subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1))
when lower(subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1))
then subStr(subStr(t.txt,((level - 1) * 5) + 1,5),1,4) ||
upper(subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1))
else subStr(t.txt,((level - 1) * 5) + 1,5)
end
)
within group (order by level)
from
dual
connect by
subStr(t.txt,((level - 1) * 5) + 1,5) is not null
) as "newTxt"
from
test t
;
或者你可以使用PL / SQL函数:
declare
function inverseCase(
txt varChar2,
nbr number
)
return varChar2 as
newTxt varChar2(254);
txtSeg varChar2(254);
segA varChar2(254);
segB varChar2(254);
begin
for i in 0..floor(length(txt)/nbr) loop
txtSeg := subStr(txt, (i * nbr) + 1, nbr);
segA := subStr(txtSeg, 1, nbr - 1);
segB := subStr(txtSeg, nbr, 1);
newTxt := newTxt || case segB
when upper(segB) then segA || lower(segB)
when lower(segB) then segA || upper(segB)
else txtSeg
end;
end loop;
return newTxt;
end;
begin
dbms_output.put_line(inverseCase('ABCDEFGHIJKLMNOPQRSTUVWXYZ',5));
dbms_output.put_line(inverseCase('abcdefghijklmnopqrstuvwxyz',5));
dbms_output.put_line(inverseCase('ABCDEFGHIJklmnopqrstUVWXYZ',5));
dbms_output.put_line(inverseCase('abcdefghijKLMNOPQRSTuvwxyz',5));
end;
两者都返回以下输出。
nbr newTxt
1 ABCDeFGHIjKLMNoPQRStUVWXyZ
2 abcdEfghiJklmnOpqrsTuvwxYz
3 ABCDeFGHIjklmnOpqrsTUVWXyZ
4 abcdEfghiJKLMNoPQRStuvwxYz
我认为这是您正在寻找的文字。
已经有一段时间了,我忘了这个网站在我无聊的时候有多么有趣!
答案 1 :(得分:0)
作为选项之一,您可以使用CASE语句
检查第5个字符<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="myTypingText"></div>
之后会出现问题,因为您必须将字符串分成3,更改字母大小写并将它们连接起来。这将是笨重的。或者使用REPLACE函数,但是,据我所知,它不适用于特定的字符位置,只能使用模式的子字符串,因此最终会再次进行分割和连接。
Regexp可能是最不痛苦的
那就是如果我们将转换限制在SELECT语句中,没有PL / SQL过程