我在数据库中有一个列,它在一个列中包含多个值,我需要这些值作为不同的行。该列包含逗号分隔的部分,但也包含括号中带有逗号的部分。我不需要分割这部分。(仅用括号内的逗号分隔)
版本
Oracle 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)
如(口腔,中枢神经系统,血液),其中包含逗号括号,我不需要分裂。
发布于 2018-01-22 09:56:27
您可以使用正则表达式(([^(]*?(\(.*?\))?)*)(,|$)
来匹配:
[^(]*?
零或更多(但尽可能少)非开括号字符(\(.*?\))?
,可选地,一个开始括号和尽可能少的字符,直到结束括号。( )*
被包装在一个捕获组中,重复了零次或多次。( )
,以便能够引用整个匹配项(,|$)
后面跟着逗号或字符串的结尾.如下所示:
SQL Fiddle
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) |
https://stackoverflow.com/questions/48376315
复制相似问题