解析字符串数据以仅选择全名的中间名

时间:2019-04-26 16:09:16

标签: sql oracle substring string-length sql-query-store

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

中间名的要求是选择介于空格之间的名称,然后使用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

我不考虑这种情况,目前两次出现两次。我现在只选择在这种情况下的第一次出现:

例如:

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

我在下面思考(但这并不能解决仅包含A-Z数据的中间名,在这种情况下,来自ex上方的场景2将给出'n3me'而不是'is'):

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

2 个答案:

答案 0 :(得分:2)

由于您必须排除非100%字母的“单词”(例如n3ame),因此使用正则表达式更容易做到这一点。这是一种方法:

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 :(得分: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