regexp 질문 드립니다 0 7 820

by 김명제 [SQL Query] regexp [2018.02.12 21:13:53]


아래 테이블 COL 내용중 '#' 과 '#' 사이의 값중 ':'값으로만 되어있으면 ':'문자 전체를없애고

문자 OR 숫자등 ':' 가 아닌 값이 들어오면

그대로 유지 하고 싶습니다.

with tab as (
  select 'ABADF#:::#SDF#:A:#' as col,          
         'ABADF##SDF#:A:#' as col_TRANS 
   from dual
)
select * from tab
 

by 마농 [2018.02.13 08:30:13]

'#' 과 '#' 사이의 값중 ':'값으로만  되어있으면 ':'문자 전체를없애는 문제인데요.
1. 위 예시를 보면 맨 앞에는 # 이 없는데
  - 맨 앞 자료가 : 만으로 이루어 져 있는 경우는 해당되나요? 안되나요?
  - 예) '::::#abc' ===> ?
2. 맨 앞에는 # 이 없고 맨 뒤에는 # 이 있는데?
  - 이런 형태가 고정인가요?
  - 아니면 앞,뒤 # 이 있을수도 있고 없을수도 있는가요?
  - 예) 'ABADF#:::#SDF#:A:'
  - 예) 'ABADF#:::#SDF#:A:#'
  - 예) '#ABADF#:::#SDF#:A:'
  - 예) '#ABADF#:::#SDF#:A:#'
3. 혹시 # 사이에 아무것도 없는 경우는 없나요?
  - 예) 'ABADF#:::##:A:#'
4. 조건에 해당하는 패턴이 1번 나오는데?
  - 여러번 나오거나 연속으로 나올 수도 있나요?
  - 예) 'ABADF#:::#:::#:A:#' ===> ?


by 김명제 [2018.02.13 08:59:40]

질문이 너무 추상적이었습니다 ^^;;

1. 네 모든 ':' 분자는 '#' 과 '#'  사이에만 존재합니다.

2. 맨뒤에오는 '#'과 ':'는 문자 혹은 숫자가 나올때까지 뒤에서 부터 지울 예정입니다.

         select REGEXP_SUBSTR(COL, '.*[^#:]') from tab

3. ## 사이에 아무것도 없는 경우는 없습니다.

4. 네 여러번 나올수도 있습니다.


by 마농 [2018.02.13 09:17:21]

1. 네 모든 ':' 분자는 '#' 과 '#'  사이에만 존재합니다.
  - 맨 앞에 : 이 오는 경우는 없다는 거죠?
  - 맨 뒤에 : 이 오는 경우는 없나요?
  - 예) 'ABADF#:::#SDF#:::#' ===> ?
2. 맨뒤에오는 '#'과 ':'는 문자 혹은 숫자가 나올때까지 뒤에서 부터 지울 예정입니다.
  - 맨 앞에 # 이 오는 경우는 업는건가요?
  - 맨 뒤에는 # 이 항상 있는건대 지우겟다는 건가요?
  - 있을 수도 있고 없을 수도 있는데 있으면 지우겠다는 건가요?
  - 그렇다면 맨 뒤에 : 이 오는게 가능하다면?
  - 맨 뒤에 # 이 있을 때와 없을 때 결과가 달라져야 하나요?
  - 예) 'ABADF#:::#SDF#:::#' ===> ?
  - 예) 'ABADF#:::#SDF#:::'  ===> ?


by 마농 [2018.02.13 09:22:29]
WITH tab AS
(
SELECT 'ABADF#:::#SDF#:A:#' col FROM dual
UNION ALL SELECT 'ABADF#:::#:::#SDF#:A:#' FROM dual
)
SELECT col
     , REPLACE(
       REGEXP_REPLACE(REPLACE(RTRIM(col, ':#'), '#', '##'), '#:+#', '##')
       , '##', '#') AS col_trans
  FROM tab
;

 


by 김명제 [2018.02.13 09:30:36]

1. 맨앞에 오는 경우는 없습니다. 맨뒤에 오는 경우는 있지만 뒤에서 부터 읽어서 ':', '#' 문자가 아닌 값이 올때까지 잘라서 쓸 예정입니다.

    예) 'ABADF#:::#SDF#:::#::'   -> 'ABADF##SDF'

2.  - 맨 앞에 # 이 오는 경우는 업는건가요? -> 네 없습니다.
  - 맨 뒤에는 # 이 항상 있는건대 지우겟다는 건가요? ->  넵 
  - 있을 수도 있고 없을 수도 있는데 있으면 지우겠다는 건가요? -> 넵
  - 그렇다면 맨 뒤에 : 이 오는게 가능하다면? ->  지울 예정입니다
  - 맨 뒤에 # 이 있을 때와 없을 때 결과가 달라져야 하나요?
  - 예) 'ABADF#:::#SDF#:::#' ===> 'ABADF#:::#SDF'
  - 예) 'ABADF#:::#SDF#:::'  ===> 'ABADF#:::#SDF'

 

3. 아래 처럼 쿼리를 작성하였는데 #:::##::# -> ## 문자 갯수가 줄어드네요 ^^;

with tab as
 (select 'SSS#20#SF11E#1#8:EFSSSFSSF#:::##::#:::ABC' as col, 'SSS#20#SF11E#1#8:EFSSSFSSF####:::ABC' as col_TRANS from dual)
select COL AS COL, 
       col_TRANS,
       regexp_replace(col, '[#]+[^[:alnum:]]+[#]', '##') MAKE_COL
       
  from (select REGEXP_SUBSTR(COL, '.*[^#:]') col, col_TRANS from tab)
;
 

 

 


by 마농 [2018.02.13 09:35:18]

## 은 없다고 하셨는데... 있네요.


by 김명제 [2018.02.13 09:32:47]

와우!!! 감사합니다. 대단한 내공이십니다. 

간단히 해결되는군요 ^^

 

 

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