【发布时间】: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”开头。还能有哪些其他变化?对数据库中可能存在的任何语言的名字执行相同的操作。然后假设介于两者之间的所有其他内容都进入中间名?一旦你定义了规则,你就可以开始使用正则表达式了。