将FULL_NAME拆分为LAST,FIRST&中间名字

时间:2016-06-27 16:19:54

标签: sql oracle oracle11g

如何从以下格式的FULL_NAME列中拆分名称(LAST_NAME,FIRST_NAME和MIDDLE_NAME):

FULL_NAME: BARN,KE ROMAN where FIRST_NAME: KE, MIDDLE_NAME: ROMAN & LAST_NAME: BARN

我能够编写下面的sql,但是,我如何添加MIDDLE_NAME查询以及MIDDLE_NAME是否为null(ex-FULL_NAME:BARN,KE)

SELECT TRIM (SUBSTR (NAMES, INSTR (NAMES, ',', 1) + 1)) AS FIRST_NAME,
       TRIM (SUBSTR (NAMES, 1, INSTR (NAMES, ',', 1) - 1)) AS LAST_NAME
FROM TABLE

非常感谢任何帮助!

谢谢!

3 个答案:

答案 0 :(得分:0)

我相信regexp_substr()是您最好的选择:

REGEXP_SUBSTR('BARN,KE ROMAN', '[^ ]*$')

这会锚定到字符串$的末尾,然后向前看直到它到达空间。那[^ ]位就像是说'#34;每个不是空格的角色"。

正如其他人所指出的那样,如果你的中间名称中有空格,这就是一个废话。如果您的姓名不匹配first,last middle格式,您只需要希望关闭。

答案 1 :(得分:0)

这样的事情应该有用 - 涵盖输入字符串的几种可能的格式。例如(参见第二个输入)它允许逗号和名字之间留空格或没有空格。

with input_names (input_str) as (
       select 'Barn,KE  Roman' from dual union all
       select 'Utry, Rita'     from dual union all
       select 'Jam,Ilya-Dimo'  from dual
     )
select regexp_substr(input_str, '^([^,]+),'        , 1, 1, null, 1) as   last_name,
       regexp_substr(input_str, ',\s*([^\s]+)'     , 1, 1, null, 1) as  first_name,
       regexp_substr(input_str, ',\s*[^\s]+\s+(.*)', 1, 1, null, 1) as middle_name
from input_names;

结果:

LAST_NAME            FIRST_NAME           MIDDLE_NAME
-------------------- -------------------- --------------------
Barn                 KE                   Roman
Utry                 Rita
Jam                  Ilya-Dimo

答案 2 :(得分:0)

SELECT Substr(fullname, 1, Instr(fullname, ' ') - 1) AS First_Name, 
       Substr(fullname, Instr(fullname, ' ') + 1)    AS Last_Name 
FROM   emp; 

SELECT Substr('Amit Chauhan', 1, Instr('Amit Chauhan', ' ') - 1) AS First_Name, 
       Substr('Amit Chauhan', Instr('Amit Chauhan', ' ') + 1)    AS Last_Name 
FROM   dual;