2014-07-07 2 views
1

에서 데이터베이스의 열의 특정 부분을 선택하는 것은 내가 관심있는 두 개의 특정 열 (약 130 개 이상의 다른 열 중)을 가지고 있습니다. 첫 번째 열은 세로 막대 (|)로 구분 된 여러 매개 변수 이름 (각 행)을 저장하고 다음 열은 세로 막대로 구분 된 매개 변수의 값을 저장합니다. 그래서 그와 같은 -데이터베이스 (오라클)

---------------------------------------------------------------------------------------------- 
Column 1          <|||>   Column 2 
---------------------------------------------------------------------------------------------- 
par1 | par2 | par3 | par 4| par 5    <|||> val1 | val2| val3| val4| val5 
------ 

지금, 나는 특정 매개 변수에만 관심이 있으며 해당 값 (예를 들어 말을 난 그냥 PAR4 그 값의 val4 필요)입니다. 그렇게하는 가장 효율적인 방법은 무엇입니까? ADD : ASP.NET (+ C#)을 사용 중입니다. 결과를 내 페이지로 차트로 표시해야합니다. 그래서 나는 단일 매개 변수에 특히 관심이 있으며 그 값이 해당 값입니다.

추 신 : 중재자, 나는 정말로 어딘가에 답을 찾지 못했기 때문에 나는 대신 게시하기로 결정했습니다. 답변이 이미 여기 어딘가에 있다면 스레드를 닫고 해결책으로 안내해주세요. 스팸 메일을 보내지 않을 것입니다. 감사. 편집 : '세로 막대'에 대한 태그를 만들 수 없습니다 (적어도 1500 명의 담당자가 필요함). 중재자가이 게시물에 해당 태그가 필요하다고 생각되는 경우 필요에 따라 조치하십시오.

답변

1

오라클에는 내장형 문자열 토크 나이저가 없지만 여러 가지 방법으로 구분 문자열을 분할 할 수 있습니다. 이것은 정규 표현식과 CONNECT BY 절을 사용합니다.

with col1 as (
     select level as token_no 
       , regexp_substr(col1, '[^\|]+', 1, level) as token 
     from t42 
     connect by level <= regexp_count(col1, '\|') + 1 
     ) 
    , col2 as (
     select level as token_no 
       , regexp_substr(col2, '[^\|]+', 1, level) as token 
     from t42 
     connect by level <= regexp_count(col2, '\|') + 1 
     ) 
select col1.token as par 
     , col2.token as val 
from col1 
    join col2 
     on col1.token_no = col2.token_no 
where col1.token_no = 4 
/

[필연적 인 SQL 피들] [1]입니다.

참고 : 명확한 설명을 위해이 예에서 CTE를 사용했습니다. 실생활에서 이것을 기능으로 바꾸고 싶을 수도 있습니다.


실생활의 주제에 대해 이와 같이 연결된 문자열에 배열을 저장하는 것은 나쁜 습관입니다. 그것은 또한 일반적인 것, 아아.