SQL将数据从下划线分隔转换为CamelCase

时间:2013-01-30 19:23:55

标签: oracle plsql camelcasing

我想更改下划线分隔的字符串:

my_underscore_separated_string

进入CamelCase:

MyUnderscoreSeparatedString

使用SQL语句。执行此转换的最佳方法是什么(在Oracle的表中)?

我可以将下划线与REGEXP_REPLACE匹配,但是无法更改反向引用的情况。 INSTR / SUBSTR操作只允许我一次转换一个下划线。

2 个答案:

答案 0 :(得分:5)

如何使用SQL(在Oracle中)将下划线分隔的单词转换为驼峰大小写:

  1. 用空格替换所有下划线。

  2. 对字符串使用此功能:INITCAP(string)

  3. 然后用空白字符串替换所有空格。

  4. 您应该能够在一行中完成此操作。 SQL没有针对这些类型的字符串操作任务进行优化,所以如果你做了很多这样的事情,那么预计它会花费太长时间。

答案 1 :(得分: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;
/