문자열 중간에 단어를 추가하고 다른건 지워 가공해야합니다 0 2 1,729

by chrome [SQL Query] 정규표현식 REGEXP_REPLACE [2017.03.29 17:03:32]


http://www.gurubee.net/article/69313

해당 게시물 질문을 통하여 

 

 '(SELECT A.NAME , B.COMP FROM TXT_FFT.TABLE_A A, FAT.TABLE_B B WHERE A.KEY = B.KEY)'

의 내용중 TXT_ 로 시작하는 테이블 이름뒤에 @DBLINK 를 하여 @DBLINK를 추가하는 방법을 

알 수 있었습니다! 

 

헌데... 

 

TXT_로 시작하는 테이블 이름 뒤에 @DBLINK를 붙이면서 TXT_ 로 시작하는 부분은 지워줘야합니다 ㅜㅜ 

멘TO THE 붕... TXT_ 가 혹시 중복이 있을지도 몰라서  REGEXP_REPLACE한 결과에 대해 무턱대고 지울 수도 없고 (OWNER에서만 지워야 하고, 테이블명에선 지우면 안됩니다) 

 

(SELECT A.NAME , B.COMP FROM  FFT.TABLE_A@DBLINK A, FAT.TABLE_B B WHERE A.KEY = B.KEY)

이렇게 되어야한다는것이죠.  

REGEXP_REPLACE 중에 나온 인수 \1 에 대해 REPLACE작업을 시도해보았으나 

실패! 실패패패패패!  털썩.. 난 아마 안될꺼야.

by 마농 [2017.03.29 17:12:11]

첫번째 괄호가 \1 을 의미합니다. 괄호 위치만 살짝 바꿔주세요.
 - 변경전 : REGEXP_REPLACE(txt, '(txt_[^ ]+\.[^ ]+)', '\1@DBLINK', 1, 1, 'i')
 - 변경후 : REGEXP_REPLACE(txt, 'txt_([^ ]+\.[^ ]+)', '\1@DBLINK', 1, 1, 'i')
다시 생각해 보니 txt_ 앞에 공백이 있어야 정확할 것 같네요.
 - 공백추가 : REGEXP_REPLACE(txt, ' txt_([^ ]+\.[^ ]+)', ' \1@DBLINK', 1, 1, 'i') -- 수정


by chrome [2017.03.29 17:14:48]

오 신통방통하네요. ㅋㅋㅋ 

WITH T AS
(
SELECT '(SELECT A.NAME , B.COMP FROM TXT_FFT.TABLE_A A, FAT.TABLE_B B WHERE A.KEY = B.KEY)' TXT FROM DUAL
)
select REGEXP_REPLACE(txt, ' txt_([^ ]+\.[^ ]+)', ' \1@DBLINK', 1, 1, 'i')
FROM T
;
(SELECT A.NAME , B.COMP FROM FFT.TABLE_A@DBLINK A, FAT.TABLE_B B WHERE A.KEY = B.KEY)

 

\1 전에 공백하나를 추가해서 잘나옵니다. 

 

참고로 전 


WITH T AS
(
SELECT '(SELECT A.NAME , B.COMP FROM TXT_FFT.TABLE_A A, FAT.TABLE_B B WHERE A.KEY = B.KEY)' TXT FROM DUAL
)
select REGEXP_REPLACE(txt, '(txt_[^ ]+\.[^ ]+)', SUBSTR('\1@DBLINK',DECODE(INSTR('\1@DBLINK','TXT_'),0,0,INSTR('\1@DBLINK','TXT_')+3)), 1, 1, 'i')
FROM T
;

이런 뻘짓을 하는 중이였습니다...뭔가 나오긴 하는데 미심쩍은

 

고맙습니다. 꾸벅 

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