這是一個可以讓維護更容易的方法,因爲正則表達式是相同的。通過對它們進行分組來分解它們,然後爲每個元素選擇所需的組。請注意,分隔符未分組。如果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我同意,但我已經知道這些值是什麼,這是一次更大的一次導入的一部分。這些值是由客戶端提供的,所以我不相信它們會從發送的原始數據中改變。任何其他用戶將通過正在支持的應用程序添加。 –