Как спарсить имя и фамилию из строки
У меня есть столбец с именами, например ('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 шт):
Не идеально, но почему бы не так:
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