2014-09-11 2 views
-3

다음과 같이 String이 있습니다.큰 문자열 oracle regexp에서 문자열 추출

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

+0

예 (예 : 'select fro_date, date_frm, col3 from empt, select from deptno, dname = mn) 여기서 deptno = 10'은 FROM DUAL이고, 은 CHR (11) || CHR (13), ''), 'FROM', 'FROM #'), 'WHERE', ' TRUE from t) '% WHERE %'와 같은 trans 일 때을 선택하면 REGEXP_SUBSTR (trans, '(#) (. *) (*)', '*', 'FROM' (예 : #)) '% FROM %'와 같은 트랜스와 '% WHERE %'와 같은 트랜스가 아닌 경우 REGEXP_SUBSTR (트랜스, '(#) (. *)') 끝 REGEXP_SUBSTR 트랜스에서 # EMP, SAMPLETABLE # DEPT # WHERE DNAME = MN) # – user4030390

답변

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 단어 '테이블'을 찾습니다 그것은 과 같은 수 또는 문자열로 따라갈 수 있습니다.
  • 모든 단어를 찾으려면 connect by level 기술을 사용했지만을 사용했습니다.은 다른 행의 출력을 제공합니다.
  • 마지막으로 쉼표로 구분 된 값으로 단일 행에 넣으려는 경우 I 은 LISTAGG입니다.
  • 오 예, 그 q '[]'는 문자열 리터럴 기법입니다.
+0

'REGEXP'가 _CPU를 많이 사용하지 않습니까? 8-) –

+0

나는 그 주석이 올 것임을 알고 있었다. 음, 그것은 요구 사항의 특성에 의한 일회성 활동 인 것 같습니다. 그것은 BATCH 프로세스 또는 OLTP 일 수 없습니다 ;-) –

+0

Lalit 솔루션을 주셔서 감사합니다. 이 경우 테이블은 table1, table2 및 tablename에서 상수입니다. 이 경우 테이블 이름이 emp, dept 및 salgrade와 같이 다를 경우 'table [[: alnum :]] +'가 맞지 않을 수 있습니다. 나는 regexp_replace로 시도했지만, 예를 들어 desider 출력을 얻을 수 없다 : (select 'from_date, date_from, em3에서 col3 선택 (deptno, dname은 dname = mn)에서 deptno를 선택한다.) 여기서 deptno = 10' a from dname = mn) 여기서, deptno()는 emp의 #date, date_from, col3의 결과입니다. (# dept는 dname = mn입니다.) 0pt35 = emp 대신 dept – user4030390