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
答案 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;