Oracle 10g?那是一个老歌。
SQL> with test (id, name) as
2 (select 0, 'Alpha' from dual union all
3 select 1, 'Alpha Beta' from dual union all
4 select 2, 'Alpha Beta Gamma' from dual union all
5 select 3, 'Alpha Beta Gamma Omega' from dual
6 )
7 select id,
8 substr(name, 1, case when instr(name, ' ') = 0 then length(name)
9 else instr(name, ' ') - 1
10 end
11 ) first_name,
12 --
13 substr(name, instr(name, ' ') + 1,
14 instr(name, ' ', 1, 2) - instr(name, ' ') - 1
15 ) middle_name,
16 --
17 case when instr(name, ' ') = 0 then null
18 else substr(name, instr(name, ' ', 1, case when instr(name, ' ', 1, 2) = 0 then 1
19 else 2
20 end) + 1)
21 end last_name
22 from test;
ID FIRST_NAME MIDDLE_NAME LAST_NAME
---------- --------------- --------------- ---------------
0 Alpha
1 Alpha Beta
2 Alpha Beta Gamma
3 Alpha Beta Gamma Omega
SQL>
它有什么作用?在name 列中搜索空格并按照您的描述提取值。没什么特别的,除了 - 也许 - last_name 也有 case 表达式。检查第二个空格是否存在;如果不是,则第一个空格后的子字符串为 姓氏;否则,第二个空格后的子字符串是 last name。