我想更改下划线分隔的字符串:
my_underscore_separated_string
进入CamelCase:
MyUnderscoreSeparatedString
使用SQL语句。执行此转换的最佳方法是什么(在Oracle的表中)?
我可以将下划线与REGEXP_REPLACE匹配,但是无法更改反向引用的情况。 INSTR / SUBSTR操作只允许我一次转换一个下划线。
答案 0 :(得分:5)
如何使用SQL(在Oracle中)将下划线分隔的单词转换为驼峰大小写:
用空格替换所有下划线。
对字符串使用此功能:INITCAP(string)
然后用空白字符串替换所有空格。
您应该能够在一行中完成此操作。 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;
/