我想這可以用regexp最好的完成,因爲這可能是最短的方式,但其他任何建議也是好的。要使用哪一個REGEXP
說,我在PL/SQL中有一個字符串,並且如果它的值很小,我們希望每個第N個字符都大寫,如果它的大寫字母的值較小,那麼它就會大寫。例如,每五個字母。
我想檢查實現這一目標的可能性。
謝謝。
我想這可以用regexp最好的完成,因爲這可能是最短的方式,但其他任何建議也是好的。要使用哪一個REGEXP
說,我在PL/SQL中有一個字符串,並且如果它的值很小,我們希望每個第N個字符都大寫,如果它的大寫字母的值較小,那麼它就會大寫。例如,每五個字母。
我想檢查實現這一目標的可能性。
謝謝。
作爲一個選項,您可以使用CASE語句
SELECT (case
when SUBSTR(fieldname, 5,1) = upper (SUBSTR(fieldname, 5,1)) then lower (SUBSTR(fieldname, 5,1))
when SUBSTR(fieldname, 5,1) = lower (SUBSTR(fieldname, 5,1)) then upper (SUBSTR(fieldname, 5,1))
else SUBSTR(fieldname, 5,1)) 5char
FROM YourTable
問題以後會發生檢查5個字符,你就必須分3串,改變字母大小寫和將它們連接起來了。這將是龐大的。或者玩弄REPLACE函數,但是,據我所知,它並不適用於特定的字符位置,只能通過模式使用子字符串,因此您將最終再次分割和連接。
正則表達式可能至少不好受
也就是說,如果我們限制轉型是在SELECT語句只,沒有PL/SQL程序
由於我沒有什麼好週六晚上做(暗物質之後當然)我決定挑戰我的大腦。因此,在瞭解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
我認爲這是您正在尋找的文本。
這已經有一段時間了,我忘記了當我無聊時這個網站有多好玩!
聽起來像這可能是一個有趣的練習,但它有一個真實世界的應用程序?另外:我不認爲正則表達式是一個好的解決方案,因爲在反向引用上不能進行任何類型的字符串轉換(例如'LOWER()','UPPER()')。 –