【问题标题】:Oracle 11gR2: split string with multiple delimiters(add)Oracle 11gR2:使用多个分隔符拆分字符串(添加)
【发布时间】:2016-03-19 17:20:03
【问题描述】:
String val = "ABC,abc|DEF,def|GHI,g hi|JKL,jkl";

如何使用 sql、pl/sql 或其他方式拆分此字符串并插入到表中。

, 是列分隔符,| 是行分隔符。

有可能吗?

[预期结果]

col1    col2
------------
ABC     abc
DEF     def
GHI     g hi
JKL     jkl

补充题

谢谢回复。 我还有一个问题。

这是一个字符串。

String val = "ABC,abc||D|@EF,def||G|HI,g hi||JKL,jkl";

我只想用|| 分隔符分割。正则表达式如何使用?

我试试'[^|]{2}+''^[|]{2}+', 1,等。

这是我的错误结果。

[错误结果]

COL1       COL2
---------- ----------
BC         abc
           D
@EF        def
           G
HI         g hi
JKL        jkl

[预期结果]

col1    col2
-----------
ABC     abc
D|@EF   def
G|HI    g hi
JKL     jkl

【问题讨论】:

    标签: sql regex oracle plsql split


    【解决方案1】:

    试试这个。它会帮助你。

    SELECT SUBSTR(A.tx,1,instr(a.tx,',',1)-1) col1,
      SUBSTR(A.tx,instr(a.tx,',',1)       +1,LENGTH(a.tx)) col2
    FROM
      (SELECT TRIM(regexp_substr(REPLACE('ABC,abc||D|@EF,def||G|HI,g hi||JKL,jkl','||','$'),'[^$]+', 1, level)) tx
      FROM dual
        CONNECT BY regexp_substr(REPLACE('ABC,abc||D|@EF,def||G|HI,g hi||JKL,jkl','||','$'), '[^$]+', 1, level) IS NOT NULL
      )A;
    

    【讨论】:

    • 这个查询有效!谢谢。我修改了问题。请检查一下。
    • 立即查看。可以满足您的要求。
    • 哇!!谢谢!!这正是我想要的!
    • 如果你有一个 NULL 元素或者你的数据包含一个美元符号,我担心这会失败。您能保证您的数据不包含 NULL 或美元符号吗?总是期待意外。
    【解决方案2】:

    这是一种不同的方法,可以处理空值并且不会冒更改任何数据的风险。它使用 with 子句按分隔符分解数据,最后以逗号分隔。

    假设:已采取措施确保数据已清除分隔符(逗号和竖线)。

    -- Original data with multiple delimiters and a NULL element for testing.
    with orig_data(str) as (
      select 'ABC,abc||||G|HI,g hi||JKL,jkl' from dual 
    ),
    --Split on first delimiter (double-pipes)
    Parsed_data(rec) as (
      select regexp_substr(str, '(.*?)(\|\||$)', 1, LEVEL, NULL, 1)
      from orig_data
      CONNECT BY LEVEL <= REGEXP_COUNT(str, '\|\|') + 1 
    )
    -- For testing-shows records based on 1st level delimiter
    --select rec from parsed_data;
    
    -- Split the record into columns
    select regexp_replace(rec, '^(.*),.*', '\1') col1,
           regexp_replace(rec, '^.*,(.*)', '\1') col2
    from Parsed_data;
    

    【讨论】:

    • 我完全满意。谢谢!!它非常有效。我可以从这个查询中学到很多东西!
    • 酷,这就是我们来这里的目的。 :-) 无论您选择哪种方法,请务必将其记录下来,以供您之后维护代码的人使用。
    【解决方案3】:

    试试这个。希望这会有所帮助。

    SELECT  
    REGEXP_SUBSTR (str, '[^,]+', 1, 1)    AS COL1
    ,REGEXP_SUBSTR (str, '[^,]+', 1, 2)    AS COL2
    from (
    
      select  
       trim(regexp_substr('ABC,abc|DEF,def|GHI,ghi|JKL,jkl', '[^|]+', 1, LEVEL)) str
      FROM 
      DUAL
      CONNECT BY instr('ABC,abc|DEF,def|GHI,ghi|JKL,jkl', '|', 1, LEVEL - 1) > 0
      )
    

    【讨论】:

    【解决方案4】:
    We can use CTE(Common Table Expressions).  For the first part of your query try this:
    
    with cte(i,strr1,strr2) as
    (
    select 1 as i,regexp_substr('ABC,abc|DEF,def|GHI,g hi|JKL,jkl','[A-Z]+',1,1) as strr1,regexp_substr('ABC,abc|DEF,def|GHI,g hi|JKL,jkl','[a-z]+(\s)*[a-z]+|[a-z]+(\s)*[a-z]+|',1,1) as strr2 from dual
    union all
    select i+1,regexp_substr('ABC,abc|DEF,def|GHI,g hi|JKL,jkl','[A-Z]+',1,i+1) as strr1,regexp_substr('ABC,abc|DEF,def|GHI,g hi|JKL,jkl','[a-z]+(\s)*[a-z]+|[a-z]+(\s)*[a-z]+|',1,i+1) as strr2 from cte where i+1<5
    )select strr1,strr2 from cte;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多