我有一列存储全名。我需要用名字,姓氏,中间名,前缀等来解析它。
中间名的要求是选择介于空格之间的名称,然后使用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))
答案 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>
假设第一个空格后的第一个单词,但全名中至少有三个单词。