2013-08-02 2 views
1

내가 가진 문자열추출 특정 패턴 오라클 SQL

with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual) 
select * from xx 

는 다음

 IDNO |        TEST 
     +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
     id9 | untest X456789,W357987 and Q321089 cont group 

같은 일부 thosand 행은 내가 6 다음 문자로 시작하는 단어를 추출 할 수 있습니다처럼 자릿수. 또한,

결과 테이블을 (나중에 내가 여러 행에 배치됩니다 때문에) 그들 사이에 쉼표가 있어야한다 : 나는 regexp_replace을 시도했지만 해결책에 도달 할 수

 IDNO |    TEST 
     +++++++++++++++++++++++++++++++++++++++++ 
     id9 | X456789,X321678,W357987,Q321089 

.

select idno, REGEXP_replace(test,'([^[A-Z]{1}[:digit:]{6},?])') AS test from xx 
+0

데이터베이스를 정상화하셨습니까? –

+0

의도적으로 비정규 화 된 OLAP 환경입니다. (조인이 적고 코드가 깨끗합니다). 위의 표는 제 3 자 기관으로부터 받았고 불행히도 우리의 필요에 따라 형식을 지정할 기회가 없었습니다. – bonsvr

+0

정규화에 대한 이해가 부족한 것은 아닙니다. 행운을 빕니다! :) –

답변

4

다음은 원래의 문자열을 원하는 것을 :

with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual 
) 
select idno, 
     REGEXP_replace(test, 
         '([A-Z]{1}[0-9]{6}[ ,]?)|(.)', '\1' 
        ) AS test 
from xx; 

쉼표로 두 번째 공간을 얻기. . . 일반 교체를 사용할 수 있습니다.

with xx as (
select 'id9' idno,'untest X456789,W357987 and Q321089 cont group' test from dual 
) 
select idno, 
     replace(REGEXP_replace(test, 
           '([A-Z]{1}[0-9]{6}[ ,]?)|(.)', '\1' 
          ), 
       ' ', ',') AS test 
from xx; 

SQL 피들은 here입니다.

+0

Mr. Linoff, 첫 번째 쿼리는 원래 문자열을 변경하지 않았습니다. 두 번째 단어는 모든 단어 사이에 쉼표를 넣었습니다. – bonsvr

+0

http://sqlfiddle.com/#!4/d41d8/15290 – bonsvr

+0

@bonsvr. . . 나는 그것을 사과한다. 나는 SQL Fiddle에서 작업 했었고 틀린 쿼리를 대답에 복사했다. 결정된. –