当我将regexp_substr与connect by子句和level一起使用时,如何从双列中选择多个列

时间:2018-07-17 12:36:48

标签: sql regex oracle

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和名称)的多行,我应该怎么做?

1 个答案:

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