You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:45:36