在 oracle 10g 中拆分一个可变长度的字符串
Split a variable length string in oracle 10g
我在拆分包含 oracle 名称的 space 定界可变长度字符串时遇到问题 10g.Below 是我的意思的几个例子
1. Name : Alpha Beta
First_Name : Alpha
Last_Name : Beta
2. Name : Alpha Beta Gamma
First_Name : Alpha
Middle_Name : Beta
Last_Name : Gamma
3. Name : Alpha Beta Gamma Omega
First_Name : Alpha
Middle_Name : Beta
Last_Name : Gamma Omega
谢谢。
甲骨文 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
列中搜索 spaces 并按照您的描述提取值。它没有什么特别之处,除了 - 也许 - last_name
也有 case
表达。它检查第二个 space 是否存在;如果不是,则第一个 space 之后的子串是 last name;否则,第二个 space 之后的子串是 last name.
您可以在Oracle DB 10g版本中使用一些正则表达式函数,例如REGEXP_INSTR()
和REGEXP_SUBSTR()
:
WITH t(id,name) AS
(SELECT 1,'Alpha Beta'
FROM dual
UNION ALL
SELECT 2,'Alpha Beta Gamma'
FROM dual
UNION ALL
SELECT 3,'Alpha Beta Gamma Omega' FROM dual)
SELECT id,
REGEXP_SUBSTR(name, '([^ ]+)', 1, 1) AS First_Name,
CASE
WHEN LENGTH(name) - LENGTH(REPLACE(name,' ')) > 1 THEN
REGEXP_SUBSTR(name, '([^ ]+)', 1, 2)
END AS Middle_Name,
CASE
WHEN LENGTH(name) - LENGTH(REPLACE(name,' ')) = 1 THEN
REGEXP_SUBSTR(name, '([^ ]+)', 1, 2)
ELSE
TRIM(REGEXP_SUBSTR(name, '(( .*)+)',REGEXP_INSTR(name, ' ',1,2),1))
END AS Last_Name
FROM t
结果集 :
ID
FIRST_NAME
MIDDLE_NAME
LAST_NAME
1
Alpha
Beta
2
Alpha
Beta
Gamma
3
Alpha
Beta
Gamma Omega
我在拆分包含 oracle 名称的 space 定界可变长度字符串时遇到问题 10g.Below 是我的意思的几个例子
1. Name : Alpha Beta
First_Name : Alpha
Last_Name : Beta
2. Name : Alpha Beta Gamma
First_Name : Alpha
Middle_Name : Beta
Last_Name : Gamma
3. Name : Alpha Beta Gamma Omega
First_Name : Alpha
Middle_Name : Beta
Last_Name : Gamma Omega
谢谢。
甲骨文 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
列中搜索 spaces 并按照您的描述提取值。它没有什么特别之处,除了 - 也许 - last_name
也有 case
表达。它检查第二个 space 是否存在;如果不是,则第一个 space 之后的子串是 last name;否则,第二个 space 之后的子串是 last name.
您可以在Oracle DB 10g版本中使用一些正则表达式函数,例如REGEXP_INSTR()
和REGEXP_SUBSTR()
:
WITH t(id,name) AS
(SELECT 1,'Alpha Beta'
FROM dual
UNION ALL
SELECT 2,'Alpha Beta Gamma'
FROM dual
UNION ALL
SELECT 3,'Alpha Beta Gamma Omega' FROM dual)
SELECT id,
REGEXP_SUBSTR(name, '([^ ]+)', 1, 1) AS First_Name,
CASE
WHEN LENGTH(name) - LENGTH(REPLACE(name,' ')) > 1 THEN
REGEXP_SUBSTR(name, '([^ ]+)', 1, 2)
END AS Middle_Name,
CASE
WHEN LENGTH(name) - LENGTH(REPLACE(name,' ')) = 1 THEN
REGEXP_SUBSTR(name, '([^ ]+)', 1, 2)
ELSE
TRIM(REGEXP_SUBSTR(name, '(( .*)+)',REGEXP_INSTR(name, ' ',1,2),1))
END AS Last_Name
FROM t
结果集 :
ID | FIRST_NAME | MIDDLE_NAME | LAST_NAME |
---|---|---|---|
1 | Alpha | Beta | |
2 | Alpha | Beta | Gamma |
3 | Alpha | Beta | Gamma Omega |