Анализировать данные строки, чтобы выбрать только второе имя в полном имени - PullRequest
3 голосов
/ 26 апреля 2019

У меня есть столбец, в котором хранится полное имя. Мне нужно разобрать это по имени, фамилии, отчеству, префиксу и т. Д.

Требуется отчество для второго имени, чтобы выбрать имя, которое находится между пробелом, а затем имя с помощью символов A-z, а затем пробел. Противник:

Name- My name is 
Middle name-> name

Full name-> My n3ame is this
Middle Name-> is

Full name-> My name
Middle name-> NULL

Я не рассматриваю сценарий, в котором это двойное пространство присутствует дважды. Сейчас я выбираю только первое вхождение в этом случае:

Ex:

Full Name-> My name is this
Middle name-> name

Я думал ниже (но это не касается среднего имени, имеющего только данные A-Z, в сценарии 2 выше ex в этом случае даст 'n3me' вместо 'is'):

SUBSTR(FULL_name,Instr(Full_name,' '),Instr(Full_name,' ',2))

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Поскольку вы должны исключить "слова" (например, n3ame), которые не являются на 100% буквенными, это проще сделать с помощью регулярных выражений. Вот один из способов:

with t(full_name) as (
  select 'My name is'       from dual union all
  select 'My n3ame is this' from dual union all
  select 'My name'          from dual   
)
select full_name, 
       regexp_substr(full_name, '^.*? ([[:alpha:]]+) ', 1, 1, null, 1) middle_name
from   t
;

FULL_NAME          MIDDLE_NAME     
----------------   ----------------
My name is         name            
My n3ame is this   is              
My name 

Это вернет первое вхождение строки из 1 или более последовательных букв, найденных между пробелами.

1 голос
/ 26 апреля 2019

Вы можете использовать regexp_substr:

with t(full_name) as
(
 select 'My name is' from dual union all
 select 'My n3ame is this' from dual union all
 select 'My name' from dual   
)    
select 
      case when (regexp_substr(full_name, '[^ ]+', 1, 3) is null ) then
           regexp_substr(full_name, '[^ ]+', 1, 3)
      else
         case when (regexp_like(full_name, '\d')) then
           regexp_substr(full_name, '[^ ]+', 1, 3)
         else
           regexp_substr(full_name, '[^ ]+', 1, 2) 
         end  
      end as "Middle Name"                                          
 from t;

Middle Name
-----------
name
is
<NULL>

, который рассматривает первое слово после первого пробела, при условии, что в full_name есть как минимум три слова.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...