Как спарсить имя и фамилию из строки

У меня есть столбец с именами, например ('Max Mustermann') и мне нужно спарсить first_name и last_name. Проблема в том, что иногда вместо имени попадается название предприятия, имена нескольких человек или имена состоящие из 4-5 слов. Нормальное имя должно иметь минимум 2 буквы. В этом случае я хотел бы получить NULL для first_name и last_name. Подскажите как это можно сделать средствами SQL или PL/SQL (БД: Oracle 12.2).

Пример входных данных:

NAME
Max Mustermann
Doe, John
Ursula von der Leyen
Рога и Копыта
J Li

На выходе хотелось бы получить следующее:

FIRST_NAME      LAST_NAME
Max             Mustermann
John            Doe
NULL            NULL
NULL            NULL
NULL            Li

Собственная попытка решения:

select 
  regexp_replace(name, '^([[:alpha:]]{2,})[[:space:]]+([[:alpha:]]{2,})$', '\1') as first_name,
  regexp_replace(name, '^([[:alpha:]]{2,})[[:space:]]+([[:alpha:]]{2,})$', '\2') as last_name
from table_name

Собственная попытка решения нормально отрабатывает для имен состоящих из двух слов. Если слов больше тогда и в first_name и в last_name попадает все исходное значение целиком.


Ответы (1 шт):

Автор решения: 0xdb

Не идеально, но почему бы не так:

select 
    regexp_substr (name, '^([[:alpha:]]{2,}),?\s+[[:alpha:]]+$',1,1,null,1) first_name,
    regexp_substr (name, '^[[:alpha:]]+,?\s+([[:alpha:]]{2,})$',1,1,null,1) last_name
from t
/
 
FIRST_NAME       LAST_NAME       
---------------- ----------------
Max              Mustermann      
Doe              John            
NULL             NULL            
NULL             NULL            
NULL             Li              
→ Ссылка