首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列文本拆分为行(提取括号中的分隔符) ORACLE SQL

将列文本拆分为行(提取括号中的分隔符) ORACLE SQL
EN

Stack Overflow用户
提问于 2018-01-22 07:13:31
回答 1查看 717关注 0票数 0

我在数据库中有一个列,它在一个列中包含多个值,我需要这些值作为不同的行。该列包含逗号分隔的部分,但也包含括号中带有逗号的部分。我不需要分割这部分。(仅用括号内的逗号分隔)

版本

Oracle 11g

示例:

代码语言:javascript
运行
复制
**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)"

我需要这条绳子

代码语言:javascript
运行
复制
 - 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)

如(口腔,中枢神经系统,血液),其中包含逗号括号,我不需要分裂。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-22 09:56:27

您可以使用正则表达式(([^(]*?(\(.*?\))?)*)(,|$)来匹配:

  • [^(]*?零或更多(但尽可能少)非开括号字符
  • 然后,(\(.*?\))?,可选地,一个开始括号和尽可能少的字符,直到结束括号。
  • ( )*被包装在一个捕获组中,重复了零次或多次。
  • 封装在捕获组中的( ),以便能够引用整个匹配项
  • (,|$)后面跟着逗号或字符串的结尾.

如下所示:

SQL Fiddle

Oracle 11g R2架构设置

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

结果

代码语言:javascript
运行
复制
| 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) |
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48376315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档