2010-11-26 9 views
1

の取り扱いには、例えば、私は、文字列'This Is An Example Of The String'
を持っていると私は、この結果を返したい'This is an Example of the String'
==>私が望むすべて、「です」「」「の」 ''は小文字で、残りはInitcapにとどまります。SQL - 文字列

これは簡単でユニークなクエリでどのように行うことができますか?ここで下ケースのみ「」への私のクエリは次のとおりです。

SELECT 'This Is An Example Of The String', 
     CASE 
     WHEN 'This Is An Example Of The String' like '% Of %' 
     THEN replace('This Is An Example Of The String', ' Of ', ' of ') 
     END 
    FROM dual ; 

ありがとう!

+0

これはおそらくregexp_replace()を使って行うことができますが、これは正規表現グループ(これはこの場合必要となります)で使用したことはありません。 –

答えて

4

はこれを試してみてください:

SELECT REPLACE(REPLACE(REPLACE(REPLACE('This Is An Example Of The String', 'Of', 'of'), 'The', 'the'), 'An', 'an'), 'Is', 'is') FROM dual; 

私もことを書いた後、少し汚れを感じます。

編集:余分な 'an'置換を削除してからインデントを追加し、再びインデントを削除しました。どのようにラップしても醜いように見えます。

+1

私はそれを少し汚れているように感じます。 :) – Timbo

+0

時には少し悪事が必要です=)私はそれらを好きになる必要はありません。 – JonVD

+0

ありがとう! )私は同意します、それはbautifulではありません;) – mcha

2

基本的には、あなたが説明した性質の多くの論理を取ります。すばやく簡単な方法はありません。このタイプの操作は、データベースではなくビジネスロジックコードですばやく簡単に実行できます。

データベースでそれを行う場合は、this oneのような関数でロジックをラップすることを検討してください。

+0

あなたの答えをありがとう、問題は、彼らはすでにデータベースのINITCAP(column_name)であり、私はそれらを更新する必要があります – mcha

+0

を理解しています。文字列を分割し、SQL以外のほとんどのことを行うのがはるかに簡単な他の値の辞書に対してそれらを操作するようなオプションの点で考えてみてください!がんばろう。 – Timbo

0

私はあなたにアルゴリズムを教えてもらえますが、SQLでそれを行う方法がわかりません。例えば:

words[] = string.split(" ") 
foreach word in words 
---if(word.length<=3) //do that only for short words 
-------if(word[i]>=65 && word[i]<=90) //check the ascii code for upper case 
------------word[i] += 21; // transfer it into lower case 
---new sentence += " " + words[i] //add to the resultant string 
2

それは純粋なSQLソリューションではないですが、別のオプションは、おそらくREPLACE_MULTIそれを呼び出し、必要に応じて文字列を変換関数を定義することです。呼び出しは

SELECT REPLACE_MULTI('This Is An Example Of The String', 
        'Is|An|Of|The', 
        'is|an|of|the') 
    FROM DUAL; 

ようなものになるだろうと実施は、私は定期的にexpression-が解除されます作成することができるトークンの文字列があることを確信している

CREATE OR REPLACE FUNCTION REPLACE_MULTI(strOriginal   IN VARCHAR2, 
             strTokens_to_replace IN VARCHAR2, 
             strReplacement_tokens IN VARCHAR2) 
    RETURN VARCHAR2 
IS 
    strResult    VARCHAR2(2000); 
    arrTokens_to_replace DBMS_SQL.VARCHAR2A; 
    arrReplacement_tokens DBMS_SQL.VARCHAR2A; 
    i      NUMBER; 

    FUNCTION extract_tokens(p_string IN VARCHAR2, 
          p_separators IN VARCHAR2) RETURN DBMS_SQL.VARCHAR2A 
    IS 
    arrTokens DBMS_SQL.VARCHAR2A; 
    BEGIN 
    WITH sel_string AS 
     (SELECT p_string AS fullstring FROM DUAL) 
    SELECT SUBSTR(fullstring, beg + 1, end_p - beg - 1) AS token 
     BULK COLLECT INTO arrTokens 
     FROM (SELECT beg, LEAD(beg) OVER (ORDER BY beg) AS end_p, fullstring 
       FROM (SELECT beg, fullstring 
         FROM (SELECT LEVEL beg, fullstring 
           FROM sel_string 
           CONNECT BY LEVEL <= LENGTH(fullstring)) 
         WHERE INSTR(p_separators, SUBSTR(fullstring, beg, 1)) > 0 
        UNION ALL 
         SELECT 0, fullstring FROM sel_string 
        UNION ALL 
         SELECT LENGTH(fullstring) + 1, fullstring FROM sel_string)) 
     WHERE end_p IS NOT NULL AND 
      end_p > beg + 1; 

    RETURN arrTokens; 
    END extract_tokens; 

BEGIN 
    arrTokens_to_replace := extract_tokens(strTokens_to_replace, '|'); 
    arrReplacement_tokens := extract_tokens(strReplacement_tokens, '|'); 

    strResult := strOriginal; 

    FOR i IN 1..arrTokens_to_replace.COUNT LOOP 
    strResult := REGEXP_REPLACE(strResult, 
           '^' || arrTokens_to_replace(i) || ' ', 
           arrReplacement_tokens(i)); 
    strResult := REPLACE(strResult, 
         ' ' || arrTokens_to_replace(i) || ' ', 
         ' ' || arrTokens_to_replace(i) || ' '); 
    strResult := REGEXP_REPLACE(strResult, 
           ' ' || arrTokens_to_replace(i) || '$', 
           ' ' || arrReplacement_tokens(i)); 
    END LOOP; 

    RETURN strResult; 
END REPLACE_MULTI; 

の線に沿って何かだろう( '^'や '$'をそこに入れて、スパークが飛ぶのを見てみましょう:-)しかしこれは最初のハックには十分です。

(ちなみに、 'extract_tokens'ルーチンは私のものではありません - 私はいつかウェブ上でそれを見つけ出し、これを作成した人に永遠に感謝しています)。

共有して楽しんでください。