Oracle中如何拆分全名列?请求SQL实现代码
Oracle数据库拆分全名列为名字与姓氏的SQL实现
场景1:全名仅以单个空格分隔(格式:姓氏 名字)
假设表名为person,存储全名的列名为full_name,可以用SUBSTR和INSTR函数直接拆分:
SELECT full_name, SUBSTR(full_name, 1, INSTR(full_name, ' ') - 1) AS last_name, SUBSTR(full_name, INSTR(full_name, ' ') + 1) AS first_name FROM person;
INSTR(full_name, ' ')定位第一个空格的位置- 截取空格前的内容作为姓氏(
last_name),空格后的作为名字(first_name)
场景2:全名包含中间名(格式:姓氏 中间名 名字)
如果需要将最后一个空格后的内容作为名字,前面所有内容作为姓氏(含中间名),可以用反向查找空格:
SELECT full_name, SUBSTR(full_name, 1, INSTR(full_name, ' ', -1) - 1) AS last_name, SUBSTR(full_name, INSTR(full_name, ' ', -1) + 1) AS first_name FROM person;
INSTR(full_name, ' ', -1)定位最后一个空格的位置
场景3:全名存在多个连续空格
先通过正则替换将多空格合并为单个,再执行拆分:
SELECT full_name, SUBSTR(clean_full_name, 1, INSTR(clean_full_name, ' ') - 1) AS last_name, SUBSTR(clean_full_name, INSTR(clean_full_name, ' ') + 1) AS first_name FROM ( SELECT full_name, REGEXP_REPLACE(full_name, '\s+', ' ') AS clean_full_name FROM person );
REGEXP_REPLACE(full_name, '\s+', ' ')把任意数量的连续空格替换为单个空格
处理无空格的异常情况
如果全名列可能没有空格(比如只有名字或姓氏),用CASE分支处理避免报错:
SELECT full_name, CASE WHEN INSTR(full_name, ' ') > 0 THEN SUBSTR(full_name, 1, INSTR(full_name, ' ') - 1) ELSE full_name END AS last_name, CASE WHEN INSTR(full_name, ' ') > 0 THEN SUBSTR(full_name, INSTR(full_name, ' ') + 1) ELSE NULL END AS first_name FROM person;
- 无空格时,姓氏默认取全名,名字设为
NULL(可根据业务需求调整)
内容的提问来源于stack exchange,提问作者Jimbo
相关产品推荐
相关产品推荐

