3

我有一列存储全名。我需要解析这个名字,姓氏,中间名,前缀等。

中间名的要求是选择介于空格之间的名称,然后用 Az Chars 命名,然后是空格。敌人前:

Name- My name is 
Middle name-> name

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

Full name-> My name
Middle name-> NULL

我暂时不考虑这个双倍空间出现两次的情况。我现在只选择第一次出现这种情况:

前任:

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

我在下面考虑(但这不考虑只有 AZ 数据的中间名,在这种情况下,上面的场景 2 将给出 'n3me' 而不是 'is'):

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

2 回答 2

2

由于您必须排除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 个或多个连续字母组成的字符串的第一次出现。

于 2019-04-26T17:13:26.683 回答
1

您可以使用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>

它考虑第一个空格之后的第一个单词,前提是全名中至少有三个单词。

Demo

于 2019-04-26T16:29:30.067 回答