编写SQL语句将Student表数据插入MM_Student表(含姓名拆分规则)
拆分FullName并插入MM_Student的SQL实现
嘿,这就帮你搞定这个姓名拆分+数据插入的需求!考虑到你给出的Student表用了VARCHAR2,应该是Oracle环境,我准备了两种实现方案,都严格遵循你的规则:
方案一:使用基础字符串函数(兼容性更好)
这种方式依赖Oracle的INSTR和SUBSTR函数,适合所有Oracle版本:
INSERT INTO MM_Student (StuId, FirstName, MiddleName, FamilyName) SELECT StuId, -- 提取FirstName:第一个空格左侧的首个单词 CASE WHEN INSTR(FullName, ' ') > 0 THEN SUBSTR(FullName, 1, INSTR(FullName, ' ') - 1) ELSE FullName END AS FirstName, -- 提取MiddleName:仅当存在第二、第三个单词时返回中间部分 CASE -- 当FullName至少有3个单词时(第一个空格和最后一个空格位置不同) WHEN INSTR(FullName, ' ') > 0 AND INSTR(FullName, ' ', -1) > INSTR(FullName, ' ') THEN SUBSTR(FullName, INSTR(FullName, ' ') + 1, INSTR(FullName, ' ', -1) - INSTR(FullName, ' ') - 1) ELSE NULL END AS MiddleName, -- 提取FamilyName:最后一个单词(必存在) CASE WHEN INSTR(FullName, ' ', -1) > 0 THEN SUBSTR(FullName, INSTR(FullName, ' ', -1) + 1) ELSE FullName END AS FamilyName FROM Student;
各字段逻辑说明
- FirstName:如果姓名有空格,取第一个空格前的内容;如果只有单个单词,就直接用这个单词(此时FamilyName也会是同一个)。
- MiddleName:只有当姓名包含至少3个单词时,才提取第一个和最后一个单词之间的部分;如果是2个或1个单词,返回
NULL。 - FamilyName:如果姓名有空格,取最后一个空格后的内容;如果只有单个单词,直接用这个单词(满足“每条数据必包含”的要求)。
方案二:使用正则表达式(可读性更强)
如果你的Oracle版本支持正则函数(10g及以上),可以用这种更简洁的写法:
INSERT INTO MM_Student (StuId, FirstName, MiddleName, FamilyName) SELECT StuId, -- 匹配开头到第一个空格的内容 REGEXP_SUBSTR(FullName, '^[^ ]+') AS FirstName, CASE -- 当空格数≥2时,去掉首尾单词保留中间部分 WHEN REGEXP_COUNT(FullName, ' ') >= 2 THEN REGEXP_REPLACE(FullName, '^[^ ]+ (.*) [^ ]+$', '\1') ELSE NULL END AS MiddleName, -- 匹配最后一个空格后的内容 REGEXP_SUBSTR(FullName, '[^ ]+$') AS FamilyName FROM Student;
这个版本的逻辑和方案一完全一致,只是用正则简化了字符串处理,读起来更直观。
内容的提问来源于stack exchange,提问作者zhuzhi
相关产品推荐
相关产品推荐

