정규식이 조금 이상하네요. 0 10 2,519

by 야신 [Oracle 기초] 정규식 [2013.07.23 17:38:31]


; 로 분리하여 문자열을 가져오고 싶은데
아래아 같이 테스트를 해보니 결과가 이상하네요
+ 로 하나 다음것을 당겨 가져오고
* 로 하나 하나를 밀어(?) 보여주네요


SELECT   regexp_substr(xxx, '[^;]*',1,1)  x1
        ,regexp_substr(xxx, '[^;]*',1,2)  x2
        ,regexp_substr(xxx, '[^;]*',1,3)  x3
        ,regexp_substr(xxx, '[^;]*',1,4)  x4
        ,regexp_substr(xxx, '[^;]+',1,1)  c1
        ,regexp_substr(xxx, '[^;]+',1,2)  c2
        ,regexp_substr(xxx, '[^;]+',1,3)  c3
        ,regexp_substr(xxx, '[^;]+',1,4)  c4
FROM ( 
SELECT 'a;;c;;' xxx  FROM dual
 )         

결과----------------------------------
x1   x2     x3       x4    c1  c2   c3   c4
NULL NULL c   a    c NULL NULL

아래와 같이 생각한 결과가 나올려면 어떻게 해야 할까요?
x1 x2 x3 x4
a  NULLNULL

ps ) xxx 원래 다른값들의 연결값입니다
즉 a  NULL c NULL NULL 이것을 연결하여 생성된것이에요.
by 용근님 [2013.07.23 17:48:32]

* 별표 왼쪽에 있는 문자가 0번 또는 그 이상
+ 플러스 기호 왼쪽에 있는 문자가 1번 또는 그 이상

by 용근님 [2013.07.23 17:57:07]
SELECT   regexp_substr(xxx, '[^@]+',1,1)  c1
    ,regexp_substr(xxx, '[^@]+',1,2)  c2
    ,regexp_substr(xxx, '[^@]+',1,3)  c3
    ,regexp_substr(xxx, '[^@]+',1,4)  c4
FROM (
SELECT REPLACE ( 'a;;c;;', ';;', '@ @' ) xxx  FROM dual
 )

by 야신 [2013.07.23 18:06:11]
c2 가 스페이스로 나오는데 그럼 다시 원래 값이 null 로 만들기 위해서 replace 를 다시 써 줘야 하는 불편함이 있네요.

by 마농 [2013.07.23 18:06:34]
연속 ";" 이 한개이거나 세개이면...

by 마농 [2013.07.23 18:07:32]
SELECT xxx
     , TRIM(REGEXP_SUBSTR(x, '[^;]+', 1, 1)) x1
     , TRIM(REGEXP_SUBSTR(x, '[^;]+', 1, 2)) x2
     , TRIM(REGEXP_SUBSTR(x, '[^;]+', 1, 3)) x3
     , TRIM(REGEXP_SUBSTR(x, '[^;]+', 1, 4)) x4
  FROM (SELECT xxx
             , REPLACE(xxx, ';', ' ;') x
          FROM (SELECT 'a;;c;;' xxx FROM dual)
        )
;

by 야신 [2013.07.23 18:20:42]
일단 어떤하든 NULL 이 아닌값으로 변환하여 가져와야겠네요.
NULL 을 NULL 로 가져오지 못하니 번거롭네요. ㅠㅠ
마농님 감사합니다.

by 신이만든짝퉁 [2013.07.23 18:08:33]
SELECT   regexp_replace(xxx, '([^;]*);([^;]*);([^;]*);([^;]*);', '\1')  x1
        , regexp_replace(xxx, '([^;]*);([^;]*);([^;]*);([^;]*);', '\2')  x2
        , regexp_replace(xxx, '([^;]*);([^;]*);([^;]*);([^;]*);', '\3')  x3
        , regexp_replace(xxx, '([^;]*);([^;]*);([^;]*);([^;]*);', '\4')  x4       

FROM (
SELECT 'a;;c;;' xxx  FROM dual
 )   

이렇게 한번 해보세요~

by 야신 [2013.07.23 18:18:28]
답변 감사합니다. 
그런데 혹시 연결하는 변수가 많아지면 좀 복잡해질것 같네요.^^;
ps ) 다시 보니 좀 복잡하긴 해도 확실하네요 

by 신이만든짝퉁 [2013.07.23 18:22:37]
연결하려는 변수가 하나 추가될 때마다

([^;]*);

를 하나씩 추가해 주면 됩니다.

by 손님 [2013.08.16 17:28:15]

아 정규식 어렵다
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입