簡體   English   中英

如有空格,如何將NAME分為3個不同的字段FIRST_NAME,MIDDLE_NAME和LAST_NAME

[英]How to split NAME into 3 different fields FIRST_NAME, MIDDLE_NAME & LAST_NAME when there is a space

如何將NAME分為3個不同的字段FIRST_NAME, MIDDLE_NAME & LAST_NAME

當前,NAME的格式為[FIRST_NAME || ' ' || MIDDLE_NAME|| ' ' ||LAST_NAME] [FIRST_NAME || ' ' || MIDDLE_NAME|| ' ' ||LAST_NAME] [FIRST_NAME || ' ' || MIDDLE_NAME|| ' ' ||LAST_NAME] 更清楚地說,假設一個人的名字是

FIRST_NAME: SHERRY 
MIDDLE_NAME: L
LAST_NAME : CLEAVES

那么“ NAME”字段中有“ SHERRY L CLEAVES”,我想要在3個不同的字段中輸入。 另外,如果只有兩個名稱,該如何處理?

一些樣本數據如下:

  ('William  Sears',
       'PETER E LABBE',
       'Edith  Roberts',
       'SHERRY L CLEAVES',
       'Sharon  Matthes',
       'TAMMY L PELLETIER',
       'STACIE M KINER',
       'MICHAEL C THOMAS',
       'CHESTER R DAVIS',
       'MICHAEL D HUTCHINSON',
       'Paul  Mikkelsen'
       )

這是一種實現方法:

with data_qry
as
(
select 'William  Sears' as name from dual union all
select 'PETER E LABBE' as name from dual union all
select 'Edith  Roberts' as name from dual union all
select 'SHERRY L CLEAVES' as name from dual union all
select 'Sharon  Matthes' as name from dual union all
select 'TAMMY L PELLETIER' as name from dual union all
select 'STACIE M KINER' as name from dual union all
select 'MICHAEL C THOMAS' as name from dual union all
select 'CHESTER R DAVIS' as name from dual union all
select 'MICHAEL D HUTCHINSON' as name from dual union all
select 'Paul  Mikkelsen' as name from dual
)
select name
     , substr(name, 1, instr(name, ' ', 1)) as first
     , case when instr(name, ' ', 1, 2) > 0 then substr(name, instr(name, ' ', 1, 1) + 1, instr(name, ' ', 1, 2) - instr(name, ' ', 1, 1) - 1) else null end as middle
     , case when instr(name, ' ', 1, 2) > 0 then substr(name, instr(name, ' ', 1, 2) + 1) else substr(name, instr(name, ' ', 1, 1) + 1) end as last
from data_qry

輸出:

NAME                 FIRST      MIDDLE     LAST
William  Sears       William               Sears
PETER E LABBE        PETER      E          LABBE
Edith  Roberts       Edith                 Roberts
SHERRY L CLEAVES     SHERRY     L          CLEAVES
Sharon  Matthes      Sharon                Matthes
TAMMY L PELLETIER    TAMMY      L          PELLETIER
STACIE M KINER       STACIE     M          KINER
MICHAEL C THOMAS     MICHAEL    C          THOMAS
CHESTER R DAVIS      CHESTER    R          DAVIS
MICHAEL D HUTCHINSON MICHAEL    D          HUTCHINSON
Paul  Mikkelsen      Paul                  Mikkelsen

你可以做這樣的事情。 我考慮了一些可能性,例如名字和姓氏之間(無中間名字首字母)或名字和名字首字母之間,或名字和姓氏之間有任意數量的空格。 也是多字母縮寫。 仍然會有很多其他未曾預料到的問題,例如姓有兩個或兩個的人等等。

with input_strings ( str ) as (
       select 'William  Sears'       from dual union all
       select 'PETER E LABBE'        from dual union all
       select 'Edith  Roberts'       from dual union all
       select 'SHERRY L CLEAVES'     from dual union all
       select 'Sharon  Matthes'      from dual union all
       select 'TAMMY L PELLETIER'    from dual union all
       select 'STACIE M KINER'       from dual union all
       select 'MICHAEL C THOMAS'     from dual union all
       select 'CHESTER R DAVIS'      from dual union all
       select 'MICHAEL D HUTCHINSON' from dual union all
       select 'Paul  Mikkelsen'      from dual
     )
select initcap(substr(str, 1, instr(str, ' ') - 1)) as first_name,
       upper(trim(substr(str, instr(str, ' '), 
               instr(str, ' ', -1) - instr(str, ' ')))) as mid_in,
       initcap(substr(str, instr(str, ' ', -1) + 1)) as last_name
from   input_strings;

FIRST_NAME                     MID_IN LAST_NAME
------------------------------ ------ ------------------------------
William                               Sears
Peter                          E      Labbe
Edith                                 Roberts
Sherry                         L      Cleaves
Sharon                                Matthes
Tammy                          L      Pelletier
Stacie                         M      Kiner
Michael                        C      Thomas
Chester                        R      Davis
Michael                        D      Hutchinson
Paul                                  Mikkelsen

11 rows selected.

嘿,別忘了正則表達式! 假設您的名稱(對於名稱來說確實太簡單了)給定的名稱規范使用了分隔符,並且您沒有處理常見的名稱問題,那么這實際上只是解析一個分隔字符串,可以使用正則表達式執行以下操作:可以處理NULL列表元素(中間的首字母):

SQL> with tbl(name) as (
   select 'William  Sears'       from dual union all
   select 'PETER E LABBE'        from dual union all
   select 'Edith  Roberts'       from dual union all
   select 'SHERRY L CLEAVES'     from dual union all
   select 'Sharon  Matthes'      from dual union all
   select 'TAMMY L PELLETIER'    from dual union all
   select 'STACIE M KINER'       from dual union all
   select 'MICHAEL C THOMAS'     from dual union all
   select 'CHESTER R DAVIS'      from dual union all
   select 'MICHAEL D HUTCHINSON' from dual union all
   select 'Paul  Mikkelsen'      from dual
   )
   select regexp_substr(name, '(.*?)( |$)', 1, 1, NULL, 1) first_name,
          regexp_substr(name, '(.*?)( |$)', 1, 2, NULL, 1) mid_init,
          regexp_substr(name, '(.*?)( |$)', 1, 3, NULL, 1) last_name
   from tbl;

FIRST_NAME           MID_INIT             LAST_NAME
-------------------- -------------------- --------------------
William                                   Sears
PETER                E                    LABBE
Edith                                     Roberts
SHERRY               L                    CLEAVES
Sharon                                    Matthes
TAMMY                L                    PELLETIER
STACIE               M                    KINER
MICHAEL              C                    THOMAS
CHESTER              R                    DAVIS
MICHAEL              D                    HUTCHINSON
Paul                                      Mikkelsen

11 rows selected.

SQL>

是的,已經被說了一百萬遍了,但是我會為您省去麻煩:substr()/ instr()更快,但是我發現嵌套的substr()/ instr()語法比令人討厭的regex語法更可怕。 我可能是少數。 不管怎樣,烈焰都消失了,你知道自己無能為力! :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM