Oracle-将全名拆分为多个部分(第一、中间、最后)



我正在oracle中编写一个过程,需要将全名分为三部分,Firstname、Middle name和lastname。

我已经完成了第一个版本,它对我有一点帮助,但需要一些增强。

详细说明我做了什么。

  SUBSTR(TRIM(EMPREGADO.ABALPH), 1, instr(TRIM(EMPREGADO.ABALPH), ' ')) "PRIMEIRO NOME",
  SUBSTR(TRIM(EMPREGADO.ABALPH), instr(TRIM(EMPREGADO.ABALPH), ' ') + 1,instr(TRIM(EMPREGADO.ABALPH), ' ', 1, 2) - instr(TRIM(EMPREGADO.ABALPH), ' ')) "NOME DO MEIO",
  SUBSTR(TRIM(EMPREGADO.ABALPH), instr(TRIM(EMPREGADO.ABALPH), ' ', -1)) "ULTIMO  NOME"

结果令人满意,但不是最优的。

示例,代码如下。

在"Empregado.ABALPH"栏上,我的名字是"PRISCILA DE OLIVEIRA TORRES"。运行选择后,结果如下

FirstName=Priscila

MiddleName=De

LastName=TORRES

因此,正如预期的那样,需要包括中间名,即介于名字和姓氏之间的所有名称。类似的东西:

FirstName=Priscila

MiddleName=De Oliveira

LastName=TORRES

或者可以是:

FirstName=Priscila

MiddleName=D.O.

LastName=TORRES

我应该如何优化我的选择,以使结果如所述?

重要提示:中间名有时可能有多个名称,如"CARLOS EDUARDO FERREIRA DA SILVA"

太多了。

可以这样做:

SQL> with empregado as (
  2  select 'PRISCILA DE OLIVEIRA TORRES' ABALPH from dual union all
  3  select 'PRISCILA OLIVEIRA TORRES' from dual union all
  4  select 'PRISCILA DA SILVA TORRES' from dual union all
  5  select 'PRISCILA DA SILVA TORRES' from dual union all
  6  select 'CARLOS EDUARDO FERREIRA DA SILVA' from dual union all
  7  select 'CARLOS EDUARDO DOS SANTOS FERREIRA DA SILVA' from dual
  8  )-- end of sample data
  9  select abalph,
 10         clean_name,
 11         regexp_substr(clean_name, '^[[:alpha:]]+') "PRIMEIRO NOME",
 12         regexp_replace(regexp_replace(clean_name, '^[[:alpha:]]+[ ]+'), '[ ]+[[:alpha:]]+$') "NOME DO MEIO",
 13         regexp_substr(clean_name, '[[:alpha:]]+$') "ULTIMO NOME"
 14    from (select regexp_replace(abalph, '( DA | DO | DAS | DOS | DE )', ' ') clean_name,
 15                 abalph
 16            from empregado) e;
ABALPH                                      CLEAN_NAME                                         PRIMEIRO NOME        NOME DO MEIO                             ULTIMO NOME
------------------------------------------- -------------------------------------------------- -------------------- ---------------------------------------- --------------------
PRISCILA DE OLIVEIRA TORRES                 PRISCILA OLIVEIRA TORRES                           PRISCILA             OLIVEIRA                                 TORRES
PRISCILA OLIVEIRA TORRES                    PRISCILA OLIVEIRA TORRES                           PRISCILA             OLIVEIRA                                 TORRES
PRISCILA DA SILVA TORRES                    PRISCILA SILVA TORRES                              PRISCILA             SILVA                                    TORRES
PRISCILA DA SILVA TORRES                    PRISCILA SILVA TORRES                              PRISCILA             SILVA                                    TORRES
CARLOS EDUARDO FERREIRA DA SILVA            CARLOS EDUARDO FERREIRA SILVA                      CARLOS               EDUARDO FERREIRA                         SILVA
CARLOS EDUARDO DOS SANTOS FERREIRA DA SILVA CARLOS EDUARDO SANTOS FERREIRA SILVA               CARLOS               EDUARDO SANTOS FERREIRA                  SILVA
6 rows selected

我猜到了一些规则,但如果你愿意,你可以删除"干净名称"列,并使用"DA DO DE等"。我只是觉得这会有所帮助,以防你在某个时候需要删除它们。

相关内容

最新更新