将列文本拆分为行(提取括号中的分隔符)ORACLE SQL
Split columntext to rows (extract delimiter in bracket) ORACLE SQL
我在数据库中有一列,其中一列包含多个值,我需要将它们作为不同的行。
该列包含逗号分隔的部分,但也包含括号中的逗号部分。我不需要拆分这些部分。 (仅在不在括号中的逗号上拆分)
版本
甲骨文 11g
示例:
**ID | Kategory**
1 | "ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(oral, CNS, blood),STO-SE 2(oral, respiratory effects)"
我需要这个字符串作为
- 1 => ATD 5(2830)
- 1 => ATO 4(510)
- 1 => EDI 1
- 1 => EH A1
- 1 => SCI 2
- 1 => SS 1
- 1 => STO-SE 1(oral,CNS, blood)
- 1 => STO-SE 2(oral, respiratory effects)
括号中包含逗号的部分(口服、中枢神经系统、血液)我不需要拆分。
可以使用正则表达式(([^(]*?(\(.*?\))?)*)(,|$)
来匹配:
[^(]*?
零个或多个(但尽可能少)非左括号字符
(\(.*?\))?
然后,可选地,左括号和尽可能少的字符直到右括号。
( )*
包裹在重复零次或多次的捕获组中
( )
包裹在捕获组中以便能够引用整个匹配项
(,|$)
后跟逗号或字符串结尾。
像这样:
Oracle 11g R2 架构设置:
CREATE TABLE table_name ( ID, Kategory ) AS
SELECT 1, 'ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(oral, CNS, blood),STO-SE 2(oral, respiratory effects)' FROM DUAL;
查询 1:
SELECT ID,
l.COLUMN_VALUE AS item,
REGEXP_SUBSTR(
Kategory,
'(([^(]*?(\(.*?\))?)*)(,|$)',
1,
l.COLUMN_VALUE,
NULL,
1
) AS value
FROM table_name t
CROSS JOIN
TABLE(
CAST(
MULTISET(
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL < REGEXP_COUNT( t.Kategory, '(([^(]*?(\(.*?\))?)*)(,|$)' )
)
AS SYS.ODCINUMBERLIST
)
) l
| ID | ITEM | VALUE |
|----|------|-------------------------------------|
| 1 | 1 | ATD 5(2830) |
| 1 | 2 | ATO 4(510) |
| 1 | 3 | EDI 1 |
| 1 | 4 | EH A1 |
| 1 | 5 | SCI 2 |
| 1 | 6 | SS 1 |
| 1 | 7 | STO-SE 1(oral, CNS, blood) |
| 1 | 8 | STO-SE 2(oral, respiratory effects) |
我在数据库中有一列,其中一列包含多个值,我需要将它们作为不同的行。 该列包含逗号分隔的部分,但也包含括号中的逗号部分。我不需要拆分这些部分。 (仅在不在括号中的逗号上拆分)
版本
甲骨文 11g
示例:
**ID | Kategory**
1 | "ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(oral, CNS, blood),STO-SE 2(oral, respiratory effects)"
我需要这个字符串作为
- 1 => ATD 5(2830)
- 1 => ATO 4(510)
- 1 => EDI 1
- 1 => EH A1
- 1 => SCI 2
- 1 => SS 1
- 1 => STO-SE 1(oral,CNS, blood)
- 1 => STO-SE 2(oral, respiratory effects)
括号中包含逗号的部分(口服、中枢神经系统、血液)我不需要拆分。
可以使用正则表达式(([^(]*?(\(.*?\))?)*)(,|$)
来匹配:
[^(]*?
零个或多个(但尽可能少)非左括号字符(\(.*?\))?
然后,可选地,左括号和尽可能少的字符直到右括号。( )*
包裹在重复零次或多次的捕获组中( )
包裹在捕获组中以便能够引用整个匹配项(,|$)
后跟逗号或字符串结尾。
像这样:
Oracle 11g R2 架构设置:
CREATE TABLE table_name ( ID, Kategory ) AS
SELECT 1, 'ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(oral, CNS, blood),STO-SE 2(oral, respiratory effects)' FROM DUAL;
查询 1:
SELECT ID,
l.COLUMN_VALUE AS item,
REGEXP_SUBSTR(
Kategory,
'(([^(]*?(\(.*?\))?)*)(,|$)',
1,
l.COLUMN_VALUE,
NULL,
1
) AS value
FROM table_name t
CROSS JOIN
TABLE(
CAST(
MULTISET(
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL < REGEXP_COUNT( t.Kategory, '(([^(]*?(\(.*?\))?)*)(,|$)' )
)
AS SYS.ODCINUMBERLIST
)
) l
| ID | ITEM | VALUE |
|----|------|-------------------------------------|
| 1 | 1 | ATD 5(2830) |
| 1 | 2 | ATO 4(510) |
| 1 | 3 | EDI 1 |
| 1 | 4 | EH A1 |
| 1 | 5 | SCI 2 |
| 1 | 6 | SS 1 |
| 1 | 7 | STO-SE 1(oral, CNS, blood) |
| 1 | 8 | STO-SE 2(oral, respiratory effects) |