2012-06-26 2 views
0

물결표로 구분 된 데이터가 포함 된 테이블의 열이 있습니다.Oracle에서 물결표로 구분 된 데이터가 포함 된 열로 작업하기

물결표로 구분 된 데이터 중 적어도 하나의 토큰이 유효한 값의 미리 정의 된 목록에없는 테이블의 모든 레코드를 반환해야하는 성능상의 이유로 단일 sql 쿼리를 실행하고 싶습니다.

다양한 포럼에서 솔루션을 찾았으며 대부분 사용자가 레코드를 분할하거나 정규 표현식을 사용하는 분할 기능을 정의했지만 단일 쿼리에서는 작동하지 않는다고 말했습니다.

누군가 나를 도와 줄 수 있습니까?

답변

3

정규식을 사용하여 단일 SQL 문에서 데이터를 구문 분석 할 수 있습니다. 그런 다음 당신은 또한 물론이

SQL> ed 
Wrote file afiedt.buf 

    1 with test as 
    2 (select 1 id, 'ABC~DEF~GHI~JKL~MNO' str from dual union all 
    3  select 2, 'XY~PDQ~435' from dual union all 
    4  select 3, 'This~is~a~test' from dual) 
    5 select id, regexp_substr (str, '[^~]+', 1, e.lvl) split 
    6 from test, 
    7   (select level lvl 
    8   from dual 
    9   connect by level <= (select max(regexp_count(str,'~')) + 1 
10        from test)) e 
11* where regexp_substr (str, '[^~]+', 1, e.lvl) is not null 
SQL>/

     ID SPLIT 
---------- -------------------- 
     1 ABC 
     2 XY 
     3 This 
     1 DEF 
     2 PDQ 
     3 is 
     1 GHI 
     2 435 
     3 a 
     1 JKL 
     3 test 
     1 MNO 

12 rows selected. 

같은 뭔가를 할 수

SQL> ed 
Wrote file afiedt.buf 

    1 with test as 
    2 (select 'ABC~DEF~GHI~JKL~MNO' str from dual) 
    3 select regexp_substr (str, '[^~]+', 1, rownum) split 
    4 from test 
    5* connect by level <= length (regexp_replace (str, '[^~]+')) + 1 
SQL>/

SPLIT 
---------------------------------------------------------------------------- 
ABC 
DEF 
GHI 
JKL 
MNO 

당신이 가고 있지 않은 미리 정의 된 목록에없는 값의 집합을 찾고 싶은 어떤 필터를 적용 할 수 있습니다 특히 효율적이기 위해서는 여러 부분 문자열을 효율적으로 색인화 할 수 없으므로 테이블을 전체적으로 검사해야합니다. 행을 생성하는 다른 방법도 있습니다. Rob van Wijk은 그의 블로그에서 다양한 interval based row generation techniques의 실적을 비교하는 기사를 가지고 있습니다.

일반적으로 데이터 모델을 수정하는 것이 좋습니다. 구분 된 데이터를 열에 저장하면 기본 정규화 원칙을 위반하게됩니다. 별도의 열 (기존 테이블과 1 대 다수의 관계가있는 별도의 테이블에있는 데이터)에 데이터를 저장 한 경우 데이터를 인덱싱 할 수 있으며 미리 정의 된 유효한 목록에 매핑되는 외래 키 제약 조건을 만들 수 있습니다 값을 사용하면 처음부터 유효하지 않은 데이터가 삽입되는 것을 방지 할 수 있습니다 (또는 적어도 새로운 잘못된 행이 향후 추가되지 않도록 할 수 있음).

+1

+1 "* 일반적으로 데이터 모델을 수정하는 것이 좋습니다. *" –

관련 문제