【问题标题】:Oracle - Splitting full name in parts (first, middle, last)Oracle - 将全名分成几部分(第一个,中间,最后一个)
【发布时间】:2015-12-22 17:56:54
【问题描述】:

我正在写一个程序,在oracle中,需要将全名分成3部分,名字,中间名和姓氏。

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

详细说明我做了什么。

  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”。运行select后,结果如下

名字 = 普莉希拉

MiddleName = 德

姓氏 = 托雷斯

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

名字 = 普莉希拉

MiddleName = 德奥利维拉

姓氏 = 托雷斯

或者可能是:

名字 = 普莉希拉

MiddleName = D.O.

姓氏 = 托雷斯

我应该如何优化我的选择,以使结果与描述的一样?

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

非常感谢。

【问题讨论】:

  • 看看改用正则表达式。
  • 好吧,正如 OldProgrammer 建议的那样,我会构建一个正则表达式,但首先您必须定义如何识别名字和姓氏的规则。例如,在您的上一个示例中,姓氏可以是一个单词,可选地以“DA”开头。还能有哪些其他变化?对数据库中可能存在的任何语言的名字执行相同的操作。然后假设介于两者之间的所有其他内容都进入中间名?一旦你定义了规则,你就可以开始使用正则表达式了。

标签: database oracle oracle11g


【解决方案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 等”。只是认为如果您需要在某些时候删除它们会有所帮助。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多