2014-09-11 328 views
-3

我有字符串如下。从大字符串提取字符串oracle正则表达式

select b.col1,a.col2,lower(a.col3) from table1 a inner join table2 b on a.col = b.col and a.col = b.col 
inner join (select col1, col2, col3,col4 from tablename) c on a.col1=b.col2  
where 
a.col = 'value' 

输出需要是table1,table2和上面字符串的tablename。请让我知道正则表达式来获得结果。

+0

这个字符串来自哪里?什么是上下文?你有什么尝试? – Toto 2014-09-11 11:05:03

+0

是的,我试过了,用t作为 (SELECT'select fro_date,date_frm,col3 from emp,sampletable(select deptno,dname from dept where dname = mn)where deptno = 10'a FROM DUAL), trans 选择REGEXP_REPLACE(replace(replace(TRANSLATE(UPPER(a),CHR(10)|| CHR(11)|| CHR(13),''),'FROM','FROM#'),'WHERE',' (#)(。*)(*)(''''),'''''','''''''') #+)') 当trans如'%FROM%'且转译不像'%WHERE%'时,则REGEXP_SUBSTR(trans,'(#)(。*)')结束REGEXP_SUBSTR from trans res#EMP,SAMPLETABLE #DEPT#WHERE DNAME = MN)# – user4030390 2014-09-11 12:47:31

回答

0

应该是一个简单的:-)

SQL> WITH DATA AS(
    2 select q'[select b.col1,a.col2,lower(a.col3) from table1 a inner join table2 b on 
    3 a.col = b.col and a.col = b.col inner join (select col1, col2, col3,col4 from tablename) 
    4 c on a.col1=b.col2 where a.col = 'value']' str 
    5 FROM DUAL) 
    6 SELECT LISTAGG(TABLE_NAMES, ' , ') WITHIN GROUP (
    7 ORDER BY val) table_names 
    8 FROM 
    9 (SELECT 1 val, 
10  regexp_substr(str,'table[[:alnum:]]+',1,level) table_names 
11 FROM DATA 
12  CONNECT BY level <= regexp_count(str,'table') 
13 ) 
14/

TABLE_NAMES 
-------------------------------------------------------------------------------- 
table1 , table2 , tablename 

SQL> 

简要说明,让OP /即使其他人可能会发现它很有用:

  • REGEXP_SUBSTR查找单词 '表' ,它可以跟着 被一个数字或字符串像1,2,名字等
  • 要找到所有这样的字,我用connect by level技术,但它 给出了不同行中的输出。
  • 最后,把它们放在一行中作为逗号分隔值,我使用 使用LISTAGG
  • 哦,是的,那q'[]'是字符串文字技术。
+0

'REGEXP' not _CPU intensive_? 8-) – 2014-09-11 11:44:27

+0

我知道评论会来,大声笑。那么,这个要求的性质似乎是一次性活动。它不能成为BATCH进程或OLTP ;-) – 2014-09-11 11:46:33

+0

Lalit感谢您的解决方案。在这种情况下,表格在table1,table2和tablename中是不变的。如果在这种情况下表格名称与emp,dept和salgrade不同,那么'table [[:alnum:]] +'可能不符合要求。我试着用regexp_replace,但我仍然无法得到例如:用t作为 (SELECT'select from_date,date_from,col3 from emp,(select deptno,dname from dept where dname = mn)where deptno = 10' FROM FROM DUAL) 从t中选择regexp_replace(a,'(select(。*?)from)','#')将导致#_date,date_from,col3 from emp,(#dept where dname = mn)where deptno = 10而不是emp,部门 – user4030390 2014-09-11 12:01:09