Oracle 11gR2:带有多个分隔符的拆分字符串(添加)

时间:2015-12-14 09:27:59

标签: sql regex oracle plsql split

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";

我想只分割||分隔符。如何使用RegExp?

我试试'[^|]{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

4 个答案:

答案 0 :(得分:0)

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

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
  )

答案 1 :(得分:0)

  

试试这个。它会帮助你。

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;

答案 2 :(得分:0)

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;

答案 3 :(得分:0)

这是一种处理空值的不同方法,并且不会冒任何数据的风险。它使用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;