如果oracle中存在多个firstname,则从Firstname获取FIrst字符

时间:2018-01-19 18:46:59

标签: sql regex oracle11g oracle-data-integrator

我有一个要求,即这些人可以拥有多个名字,我需要将名称转换为2个或更多大写字母的第一个字符。

示例:

Srinivas Kalyan ,Sai Kishore 

如果以上是一个有4个名字,那么我需要显示如下

S K S K 

逗号也会被替换并占用所有第一个字符

2. Srinivas-Kalyan Sai Kishore

对于上述名称,该值应为

S S K

因为Srinivas-Kalyan被认为是一个名字

此名称也可以是小写字母

srinivas kalyan sai kishore

对于此

S K S K

这必须是在oracle

尝试下面的regex_replace,它在sql开发人员中工作正常,但在应用程序中它正在变为空间

replace(trim(regexp_replace(to_char(regexp_replace(initcap(regexp_replace(regexp_replace
(FIRST_NAME, '[0-9]', ''), '( *[[:punct:]])', '')), '([[:lower:]]| )')), '(.)', '\1 ')),',',null)

1 个答案:

答案 0 :(得分:2)

输出中缺少的字母是由此字符删除的正则表达式引起的:

( *[[:punct:]])

这会将Kalyan ,Sai变成KalyanSai,这将在剩余的过程中被视为一个单词,因此您的输出中不会有S的S。

我建议这个较短的表达方式:

trim(upper(regexp_replace(
    regexp_replace(first_name, '([[:alpha:]])(-|[[:alpha:]])+', '\1'),
    '.*?([[:alpha:]]|$)', ' \1'
)))

解释

  1. ([[:alpha:]])(-|[[:alpha:]])+ - > \1

    这将取代任何一系列字母(或连字符)与第一个字母。所以它将单词缩减为首字母。

  2. .*?([[:alpha:]]|$) - > (space)\1

    这将替换下一个字母前面的任何内容,并带有空格。由于不会跳过任何字母(因为.*?非贪婪),这有效地用空格替换所有非字母序列。要同时替换最后的非字母(不在字母前面),可以添加特殊情况$(字符串结尾)作为替代。

  3. 在这两个步骤之后,只剩下:

    • 大写一切
    • 使用trim
    • 删除结果开头和结尾的空白

    我发现这种方法的优点是它不使用除[[:alpha]]之外的任何其他类。数字,标点符号,小写字母或其他任何内容都不需要明确标识,因为它只是[[:alpha]]的否定。必须要做的唯一例外是连字符。

    由于某些名称可能包含其他一些非字母(如引号),因此您可能希望在第一个正则表达式中添加此类字符。