2016-08-02 3 views
0

다음 열거 형 중 하나에 15-JUL-16,20-JUL-16,20-JUL-16,30-JUL-16이 있습니다.SQL Orcle : Regexp_substr

SUBSTR(REGEXP_SUBSTR(base.systemdate, '.+,'), 1, 9)을 사용하여 표현식에서 15-JUL-16 (첫 번째 쉼표까지의 표현식)을 얻었습니다.

그러나 나는 지옥을 위해 30-JUL-16 (마지막 쉼표 이후의 마지막 표현)을 얻는 방법을 알아낼 수 없습니다.

REGEXP_SUBSTR을 사용하는 방법이 있습니까? 그리고 우리가 그곳에 있기 때문에.

REGEXP_SUBSTR을 사용하여 쉼표없이 15-JUL-16을 얻는 깔끔한 방법이 있습니까? 쉼표를 없애기 위해 두 번째 SUBSTR을 사용하기 때문에 데이터 형식과 호환되도록 할 수 있습니다. (일반적으로 정규 표현식)

SELECT REGEXP_SUBSTR(base.systemdate, '[^,]+$') 

오라클 "욕심"입니다

+0

쉼표로 구분 된 항목으로 데이터를 저장하지 마십시오. 열/행마다 하나의 값이 있습니다. – jarlh

+1

쉼표로 구분 된 문자열을 분할하려고합니다. 이 질문은 여러 번 묻고 대답했습니다. "google for Oracle split csv"등입니다. – mathguy

+0

제안에 감사드립니다. 그러나 데이터웨어 하우스에 데이터가 저장되는 방식을 제어 할 수 없습니다. 나는 단지 내가 얻는 것만으로 일한다. 하지만 내 질문을 반복하십시오. SUBSTR (REGEXP_SUBSTR (base.systemdate, '. +,'), 1, 9)을 재 작성하여 추가 SUBSTR없이 REGEXP_SUBSTR 만 사용하여 콤마없이 첫 번째 날짜를 가져올 수 있습니까? –

답변

0

당신은 매우 유사한 구조를 사용할 수 있습니다. 즉, 가장 긴 문자열을 사용합니다. 당신이 목록의 항목을 알고 있다면 모두 같은 길이, 당신은 사용할 수 있습니다

SELECT SUBSTR(ase.systemdate, -9) 
+0

고마워요 :) 그 표현의 길이는 다양합니다. 때로는 2 개의 날짜가 있고, 때로는 4, 때로는 6 일이 있습니다. 그리고 나는 항상 처음과 마지막 하나 (쉼표 제외)에 관심이있어서 나중에 날짜로 사용할 수 있습니다. –

+0

'[^,] +'를 의미 했습니까? - +가 누락되었습니다. – mathguy

+0

예. + 물건이 빠졌습니다. :) 그러나 그렇지 않으면 그것은 일하고있다. 그리고 SUBSTR (REGEXP_SUBSTR (base.systemdate, '. +,'), 1, 9)을 다시 SUBSTR없이 REGEXP_SUBSTR 만 사용하여 쉼표없이 첫 번째 날짜를 가져 오는 방법은 무엇입니까? –

0

select dates from 
    (
     SELECT dates,max(id) over (partition by null) lastrec,min(id) over (partition by null) firstrec,id FROM (
      with mine as(select '15-JUL-16,20-JUL-16,20-JUL-16,30-JUL-16' hello from dual) 
       select rownum id,regexp_substr(hello, '[^,]+', 1, level) dates from mine 
       connect by regexp_substr(hello, '[^,]+', 1, level) is not null) 
    ) 
    where id=firstrec or id=lastrec 

이 쿼리 먼저주고 쉼표에서 마지막 레코드 목록을 분리했다.

관련 문제