2016-09-02 51 views
0

我想這可以用regexp最好的完成,因爲這可能是最短的方式,但其他任何建議也是好的。要使用哪一個REGEXP

說,我在PL/SQL中有一個字符串,並且如果它的值很小,我們希望每個第N個字符都大寫,如果它的大寫字母的值較小,那麼它就會大寫。例如,每五個字母。

我想檢查實現這一目標的可能性。

謝謝。

+0

聽起來像這可能是一個有趣的練習,但它有一個真實世界的應用程序?另外:我不認爲正則表達式是一個好的解決方案,因爲在反向引用上不能進行任何類型的字符串轉換(例如'LOWER()','UPPER()')。 –

回答

0

作爲一個選項,您可以使用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程序

2

由於我沒有什麼好週六晚上做(暗物質之後當然)我決定挑戰我的大腦。因此,在瞭解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 

我認爲這是您正在尋找的文本。

這已經有一段時間了,我忘記了當我無聊時這個網站有多好玩!