SELECT DISTINCT REGEXP_SUBSTR ('id1:id2','[^:]+',1,LEVEL) R ,
REGEXP_SUBSTR ('name1:name2','[^:]+',1,LEVEL) D
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('id1:id2','[^:]+',1,LEVEL)
= REGEXP_SUBSTR ('name1:name2','[^:]+',1,LEVEL)
order by 1;
我的定界符是':',通过使用上面的查询,我只能获得1行(ID和名称),但是如果我想获得具有多列(ID和名称)的多行,我应该怎么做?
答案 0 :(得分:1)
仅当ID和名称值匹配时,您的连接条件才为真-示例中的情况并非如此。
您可以计算元素的数量;如果计数不同,请使用greates()
选择较高的计数:
SELECT REGEXP_SUBSTR ('id1:id2','[^:]+',1,LEVEL) R ,
REGEXP_SUBSTR ('name1:name2','[^:]+',1,LEVEL) D
FROM DUAL
CONNECT BY LEVEL <= GREATEST (REGEXP_COUNT ('id1:id2',':'),
REGEXP_COUNT ('name1:name2',':')) + 1
order by 1;
R D
------- -----------
id1 name1
id2 name2
如果您有空元素,也可以使用safer pattern:
SELECT REGEXP_SUBSTR ('id1:id2:id3', '(.*?)(:|$)', 1, LEVEL, NULL, 1) R ,
REGEXP_SUBSTR ('name1::name3', '(.*?)(:|$)', 1, LEVEL, NULL, 1) D
FROM DUAL
CONNECT BY LEVEL <= GREATEST (REGEXP_COUNT ('id1:id2:id3',':'),
REGEXP_COUNT ('name1::name3',':')) + 1
order by 1;
R D
----------- ------------
id1 name1
id2
id3 name3