如果预言机中存在多个名字,则从名字中获取第一个字符



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

例子:

Srinivas Kalyan ,Sai Kishore 

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

S K S K 

逗号也被替换并取所有第一个字符

2. Srinivas-Kalyan Sai Kishore

对于上述名称,值应为

S S K

因为斯里尼瓦斯-卡利扬被认为是一个名字

名称也可以是小写字母

srinivas kalyan sai kishore

为此

S K S K

这必须在预言机中

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

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

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

( *[[:punct:]])

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

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

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

解释

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

    这会将任何字母序列(或连字符)替换为其中的第一个。因此,它将单词简化为首字母。

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

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

在这两个步骤之后,剩下的就是:

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

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

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

最新更新