这是一个可以让维护更容易的方法,因为正则表达式是相同的。通过对它们进行分组来分解它们,然后为每个元素选择所需的组。请注意,分隔符未分组。如果first_name中有空格,它将不起作用。
SQL> with tbl(str) as (
select 'Last_name, First_name Middle_initial:(some_other_unimportant_stuff)' from dual union
select 'Last_name Suffix, First_name Middle_initial:(some_other_unimportant_stuff)' from dual
)
select regexp_substr(str, '(.*?), (.*?) (.*?):', 1, 1, NULL, 1) Last,
regexp_substr(str, '(.*?), (.*?) (.*?):', 1, 1, NULL, 2) First,
regexp_substr(str, '(.*?), (.*?) (.*?):', 1, 1, NULL, 3) Middle
from tbl;
LAST FIRST MIDDLE
------------------ --------------- ---------------
Last_name Suffix First_name Middle_initial
Last_name First_name Middle_initial
SQL>
编辑:更新每个新名称的要求。我放弃了正则表达式的全部是相同的,而不是通过将它们锚定到字符串的开头来加强它们。对于姓氏,返回组,后跟逗号空格。名字是由逗号空间和空格包围的组,最后的中间名是由最后一个空格和冒号包围的字符组。问号使得该组是可选的,因此它应该处理如测试数据中所示的NULL名。像往常一样,测试意外!
SQL> with tbl(str) as (
select 'Last_name, First_name Middle_initial:(some_other_unimportant_stuff)' from dual union
select 'Last_name Suffix, First_name Middle_initial:(some_other_unimportant_stuff)' from dual union
select 'Doe1, D John:(...)' from dual union
select 'Doe2, John D James:(...)' from dual union
select 'Doe3, Jane:(...)' from dual
)
select regexp_substr(str, '^(.*?), ', 1, 1, NULL, 1) Last,
regexp_substr(str, '^.*, (.*?) ', 1, 1, NULL, 1) First,
regexp_substr(str, '^.* (.*?):', 1, 1, NULL, 1) Middle
from tbl;
LAST FIRST MIDDLE
------------------ --------------- ---------------
Doe1 D John
Doe2 John D James
Doe3 Jane
Last_name Suffix First_name Middle_initial
Last_name First_name Middle_initial
SQL>
尝试'regexp_substr(au.displayname,',\ s *(\ w +)\ s',1,NULL,1)''。这将在有空间时以及在名字前没有空格时起作用。 –
不要忘记考虑名称中可能包含特殊字符(如单引号,空格,连字符等)的事实。可以将猴子扳手放入解析算法中。确保仔细测试。首先对您的数据进行一些健全性检查,以确定您需要处理的数据类型。希望在输入端发生一些洗刷,所以你不必处理任何太疯狂的事情(是的,对)。 –
@Gary_W我同意,但我已经知道这些值是什么,这是一次更大的一次导入的一部分。这些值是由客户端提供的,所以我不相信它们会从发送的原始数据中改变。任何其他用户将通过正在支持的应用程序添加。 –