2011-09-09 2 views
6

Oracle에서 SQL을 사용하여 쉼표로 구분 된 문자열로 n 번째 엘리먼트를 얻으려고합니다. 나는 지금까지 다음 한오라클 SQL은 n 번째 엘리먼트 regexp를 얻습니다.

..

SELECT regexp_substr(
    '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N', 
    '[^,]+', 
    1, 
    7) 
FROM dual; 

을하지만, 요소, 즉 비어있는 경우가 작동하지 않습니다 ,, 아무도 도와 드릴까요? 당신의 구분 값이 항상 쉼표 사이의 영숫자하는 경우

+4

RDBMS에서 CSV 또는 다른 방법으로 일련 화 된 값을 볼 때 어떤 것이 옳지 않다는 것을 알고 있습니다. – NullUserException

+2

@ NullUserException, 좋은 지적. 안타깝게도 여러 번 건너 왔습니다 :-( – Ollie

답변

4

당신은 시도 할 수 :

SELECT REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, 7) 
    FROM dual; 

는 (후행 쉼표 포함) 일곱 번째 값을 얻을 수 있습니다. 비어있는 경우 쉼표 (쉽게 제거 할 수 있음) 만 얻을 수 있습니다.

분명히 일곱 번째 이외의 값을 원한다면 네 번째 매개 변수 값을 원하는 n 번째 출현으로 변경하십시오.

SELECT REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, <nth occurance>) 
    FROM dual; 

편집 : 먼저 쉼표를 교체 : 나는 REGEX 사랑으로 여기에 또한 뒤에 쉼표를 제거하는 솔루션

SELECT REPLACE(
      REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, <nth>), 
      ',' 
     ) 
    FROM dual; 

는 당신은 약간의 트릭을 할 수

+0

+1,이 작동 – DCookie

+0

안녕하세요, 내가 똑같은 문제가 있지만 내 경우에는 당신의 충고가 작동하지 않습니다. 문자열에서 3 번째 값을 가져와야합니다. 'regexp_substr을 선택하십시오 ('SENDER, 3B13, 3, 300,,,,,,', [[alnum :]] {0,}, ', 1, 2) *, ** 문자열 –

1

도움이되기를 바랍니다입니다 쉼표 다음에 공백이오고 그 후에 여분의 공백을 건너 뛰십시오.

SQL> with data as 
    2 (select '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' txt 
    3  from dual 
    4 ) 
    5 select regexp_substr(txt,'[^,]+',1,7)        seventh_element_wrong 
    6  , replace(txt,',',', ')          with_extra_space_after_comma 
    7  , regexp_substr(replace(txt,',',', '),'[^,]+',1,7)   seventh_element_leading_space 
    8  , substr(regexp_substr(replace(txt,',',', '),'[^,]+',1,7),2) the_seventh_element 
    9 from data 
10/

S WITH_EXTRA_SPACE_AFTER_COMMA 
- ---------------------------------------------------------------------------------------------------------------------- 
SEVENTH_ELEMENT_LEADING_S THE_SEVENTH_ELEMENT 
------------------------- ------------------------ 
1 100016154, 5101884LT00001, , , , , 100000010892100000012655, L, SEI, 5101884LT00001, 1, SL, 3595.03, 00, 2, N, N, G, N 
100000010892100000012655 100000010892100000012655 

Regar ds,
Rob. 정규 표현식에 붙어하지 않는 한

1

이는 잘 작동 :

WITH q AS (
SELECT '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' thestring FROM dual 
) 
SELECT SUBSTR(thestring, INSTR(thestring,',',1,6)+1, 
         INSTR(thestring,',',1,7)-INSTR(thestring,',',1,6)-1) "The Element" 
    FROM q; 

The Element 
------------------------ 
100000010892100000012655 

또 다른 가능성. 데이터 원본을 지정하지 않았습니다. 외부 테이블을 사용하여 입력 소스를 읽고 SQL을 통해 처리 할 수 ​​있습니까?

+0

REGEXP_SUBSTR을 한 번만 호출하는 것과 달리 문에 INSTR을 세 번 호출하면 오버 헤드가 발생합니까? (구분 된 문자열의 길이는 분명하지 않습니다. 요소가 될 것입니다.) – Ollie

+0

@Ollie, 결과를 알고 계시 겠지만 REGEXP_ * 함수는 고유 한 오버 헤드 문제가 없습니다. – DCookie

0
SELECT rtrim(regexp_substr('100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N','[^,]{0,}[,]?',1,7),',') 
FROM dual;