【问题标题】:Split columntext to rows (extract delimiter in bracket) ORACLE SQL将列文本拆分为行(在括号中提取分隔符)ORACLE SQL
【发布时间】:2018-01-22 07:13:31
【问题描述】:

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

版本

甲骨文 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)

像(口腔、中枢神经系统、血液)这样的部分,在括号中包含逗号,我不需要拆分。

【问题讨论】:

  • 我们可以依赖“,”,它后面没有空格,作为分隔符吗?由于 () 中的所有逗号后面都有空格,而分隔符没有
  • 嗨 Kaushik Nayak,不,这是不可信的。因为数据来自外部公司,如果每次都采用相同的格式,我们现在不能。 (逗号将保持指定)

标签: oracle split rows delimiter


【解决方案1】:

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

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

像这样:

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

Results

| 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) |

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多