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