用Oracle SQL正则表达式函数,在英文单词之间插入空格

一个后生,在修改数据库时把一个列的所有英文单词之间的空格去掉了, 例如: 本来该是 JAVA Soruce Code, 现在成了 JAVASourceCode.

现在得想办法把空格加回去, 去掉容易, 加回去就难了. 后生折腾了大半天, 无从下手. 只得把问题交到虎爸手里.

我问他是咋个考虑的, 他说他的想法是在每一个大写字母之前加一个空格, 但是, 这样虽然隔开了单词, 可全大写的缩写词如 JAVA 也被空格隔开成了 J A V A .

其实他的想法对了很大一部分, 只需要变成在每一个大写加小写的字母组合前面加空格就行了.

如果有很多个单词怎么办呢? 只需要一个一个单词地做, 把做好的和新做的拼起来.

整个过程必须要熟练运用Oracle的字符处理函数SUBSTR 和正则表达式函数REGEXP_INSTR

假定数据库表名为Table_1, 字段名为C1, 其中1行的内容为JAVASourceCode。

1. 插入空格到第二个单词之前(第一个单词是不用加空格的)。

先用字符串JAVASourceCode测试一下:

SELECT SUBSTR (‘JAVASourceCode’,1,REGEXP_INSTR (‘JAVASourceCode’, ‘([A-Z][a-z])+’, 2) – 1)
|| ‘ ‘
|| SUBSTR (‘JAVASourceCode’,REGEXP_INSTR (‘JAVASourceCode’, ‘([A-Z][a-z])+’, 2))
FROM dual
WHERE REGEXP_INSTR (‘JAVASourceCode’, ‘([A-Z][a-z])+’, 2) > 0;

 

解释一下几个函数:

REGEXP_INSTR (‘JAVASourceCode’, ‘([A-Z][a-z])+’, 2): 从’JAVASourceCode’中的第二个字符开始,找大写字符紧接小写字符第一次出现的位置. 从第二个字符开始找,可以避开第一个字符已经大写的字符串如JavaSourceCode.

几个SUBSTR: 截取前半部分, 添加空格, 再补上后把半部分.

WHERE REGEXP_INSTR (‘JAVASourceCode’, ‘([A-Z][a-z])+’, 2) > 0: 只找两个单词以上的, 只有一个单词的不用加空格.

 

得到的结果是: JAVA SourceCode, 看来可行, update表:

UPDATE table_1 SET C1 = SUBSTR (C1, 1, REGEXP_INSTR (C1, ‘([A-Z][a-z])+’, 2) – 1)
|| ‘ ‘
|| SUBSTR (C1, REGEXP_INSTR (C1, ‘([A-Z][a-z])+’, 2))
WHERE REGEXP_INSTR (C1, ‘([A-Z][a-z])+’, 2) > 0;

 

2. 插入空格到第三个单词之前

现在第一,二个单词之间已经有空格了, 继续后面的单词.

先用字符串 JAVA SourceCode 测试一下:

SELECT SUBSTR (‘JAVA SourceCode’, 1, INSTR (‘JAVA SourceCode’, ‘ ‘))
|| SUBSTR (SUBSTR (‘JAVA SourceCode’, INSTR (‘JAVA SourceCode’, ‘ ‘) + 1),1,
REGEXP_INSTR (SUBSTR (‘JAVA SourceCode’, INSTR (‘JAVA SourceCode’, ‘ ‘) + 1),
‘([A-Z][a-z])+’, 2) – 1)
|| ‘ ‘
|| SUBSTR (SUBSTR (‘JAVA SourceCode’, INSTR (‘JAVA SourceCode’, ‘ ‘) + 1),
REGEXP_INSTR (SUBSTR (‘JAVA SourceCode’, INSTR (‘JAVA SourceCode’, ‘ ‘) + 1),
‘([A-Z][a-z])+’, 2))
FROM DUAL;

得到的结果是: JAVA Source Code, 看来可行, update表:

UPDATE table_1
SET C1 = SUBSTR (C1, 1, INSTR (C1, ‘ ‘))
|| SUBSTR (SUBSTR (C1, INSTR (C1, ‘ ‘) + 1),1,
REGEXP_INSTR (
SUBSTR (C1, INSTR (C1, ‘ ‘) + 1),
‘([A-Z][a-z])+’, 2) – 1)
|| ‘ ‘
|| SUBSTR (SUBSTR (C1, INSTR (C1, ‘ ‘) + 1),
REGEXP_INSTR (SUBSTR (C1, INSTR (C1, ‘ ‘) + 1),
‘([A-Z][a-z])+’, 2))
WHERE REGEXP_INSTR (SUBSTR (C1, INSTR (C1, ‘ ‘) + 1),
‘([A-Z][a-z])+’, 2) > 0;

 

3. 同理, 对于后面的单词:

UPDATE table_1
SET C1 = SUBSTR (C1, 1, INSTR (C1, ‘ ‘, 1, 2))
|| SUBSTR (SUBSTR (C1, INSTR (C1, ‘ ‘, 1, 2)+ 1), 1,
REGEXP_INSTR (SUBSTR (C1, INSTR (C1, ‘ ‘, 1, 2) + 1),
‘([A-Z][a-z])+’, 2) – 1)
|| ‘ ‘
|| SUBSTR (SUBSTR (C1, INSTR (C1, ‘ ‘, 1, 2) + 1),
REGEXP_INSTR (SUBSTR (C1, INSTR (C1, ‘ ‘, 1, 2) + 1),
‘([A-Z][a-z])+’, 2))
WHERE INSTR (C1, ‘ ‘, 1,2) > 0
AND REGEXP_INSTR (SUBSTR (C1, INSTR (C1, ‘ ‘, 1, 2)
‘([A-Z][a-z])+’, 2) > 0;



无觅相关文章插件,快速提升流量

7 条评论 on "用Oracle SQL正则表达式函数,在英文单词之间插入空格"

commenter

正纠结在字符串处理,谢了。

commenter

没学过ORACLE的鸟飞过。

commenter

个人觉得博主魅力不错呀,文章很有深度

个人觉得博主魅力不错呀

发表您的评论

尊姓大名:
Email 地址:
网站地址:
评论内容: