2

アンダースコアで区切られた文字列を変更したい:

my_underscore_separated_string

キャメルケースに:

MyUnderscoreSeparatedString

SQL ステートメントを使用します。この変換を (Oracle のテーブルで) 行う最善の方法は何ですか?

アンダースコアを REGEXP_REPLACE と一致させることはできますが、後方参照の大文字と小文字を変更する方法はありません。INSTR/SUBSTR 操作では、一度に 1 つのアンダースコアしか変換できません。

4

2 に答える 2

5

SQL (Oracle) を使用してアンダースコアで区切られた単語をキャメルケースに変換する方法:

  1. すべてのアンダースコアをスペースに置き換えます。

  2. 文字列に対してこの関数を使用します。INITCAP(string)

  3. 次に、すべてのスペースを空白文字列に置き換えます。

これを 1 行で実行できるはずです。SQL は、これらの種類の文字列操作タスクに対して最適化されていないため、これらを多数実行する場合は、時間がかかりすぎることが予想されます。

于 2013-01-30T19:37:33.153 に答える
0

小さな PL/SQL ラッパーは、アンダースコアがなくなるまで変換を繰り返し実行できます。会社のキャメルケース規則 (頭文字が大文字で大文字の "ID") に合わせて、いくつかのステートメントを追加しました。

UPDATE md_field SET NAME = lower(NAME) WHERE NAME LIKE '%\_%' ESCAPE '\';
UPDATE md_field SET NAME = upper(substr(NAME, 1, 1))||substr(NAME, 2) WHERE NAME LIKE '%\_%' ESCAPE '\';
UPDATE md_field SET NAME = REPLACE(NAME, 'id', 'ID') WHERE NAME LIKE '%\_%' ESCAPE '\';
DECLARE
vsql             LONG;
v_cnt            NUMBER;
BEGIN
  LOOP
    vsql := 'UPDATE md_field SET NAME = substr(NAME, 1, instr(NAME, ''_'')-1)||upper(substr(NAME, instr(NAME, ''_'')+1, 1))||substr(NAME, instr(NAME, ''_'')+2) WHERE NAME LIKE ''%\_%'' ESCAPE ''\''';
    EXECUTE IMMEDIATE vsql;
    SELECT COUNT (*) INTO v_cnt FROM md_field WHERE NAME LIKE '%\_%' ESCAPE '\';
    EXIT WHEN v_cnt = 0;
  END LOOP;
END;
/
于 2013-01-30T19:23:54.853 に答える