2014-09-11 252 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