Oracle - 在部分中分割全名(第一个,中间的,最后一个)

时间:2015-12-22 17:56:54

标签: database oracle oracle11g

我正在oracle中编写一个过程,需要将全名分为3个部分,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"

结果令人满意但不是最佳。

以下代码示例。

在专栏#34; Empregado.ABALPH"上,我的名字是" PRISCILA DE OLIVEIRA TORRES"。运行select后,结果如下

FirstName = Priscila

MiddleName = De

LastName = TORRES

因此,正如预期的那样,需要包含中间名,所有名称都在firstname和lastname之间。这样的事情:

FirstName = Priscila

MiddleName = De Oliveira

LastName = TORRES

或者可能是:

FirstName = Priscila

MiddleName = D. O。

LastName = TORRES

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

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

很多。

1 个答案:

答案 0 :(得分:1)

可以这样做:

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等”,如果你愿意的话。只是觉得如果你需要在某些时候删除它们会有所帮助。