원하는 위치부터 특정문자 변경하기 0 11 891

by 불장작 [설치/설정] [2019.10.09 14:13:45]


안녕하세요 간단한 쿼리같기도 한데 제가 하기에는 좀 힘드네요

SELECT '(12345(678))' AA FROM DUAL

'('문자가 첫번째 이후에 오는 것은 다 없애고 싶은데  어떻게 해야 하는지 알고싶습니다.

고수님들의 조언 부탁드립니다.

by 마농 [2019.10.09 17:58:03]

글로만 설명하는 것은 의미가 모호합니다.
원하는 결과를 예를 들어 주세요.
위 예시 자료로 부터 원하는 결과가 어떤 값인지?
다른 예시도 다양하게 들어 주세요.


by 불장작 [2019.10.10 09:11:58]

최종적으로 원하는 값은

SELECT '(12345(678))' AA FROM DUAL 의 결과값은

() 안에 ()가 있는 경우 ()안에 있는 ()를 없애고 싶습니다.

결과값 => (12345678) 입니다.


by 마농 [2019.10.10 09:17:51]

다양한 예를 들어 주세요.
괄호는 항상 2개인지? 가변적인지?
문자의 길이나 괄호의 위치가 고정인지 가변인지?
등을 알수가 없네요.
다양한 예를 들어 주세요.


by 불장작 [2019.10.10 09:31:12]

SELECT '(12345(678))' AA FROM DUAL  => (12345678)

SELECT 'abcde(12345)(678)' AA FROM DUAL  => abcde(12345)(678)  : ()안에 ()가 없으므로 그대로 표기

SELECT 'wrrt(12678(123)1234567)' AA FROM DUAL  => wrrt(126781231234567)

SELECT '(12345678012345)' AA FROM DUAL  => (12345678012345)

 

 


by jkson [2019.10.10 09:44:14]
WITH t AS
(
SELECT '(12345(678))' TXT FROM DUAL UNION ALL
SELECT 'abcde(12345)(678)' FROM DUAl UNION ALL
SELECT 'wrrt(12678(123)1234567)' FROM DUAL UNION ALL
SELECT '(12345678012345)' FROM DUAL 
)
SELECT REGEXP_REPLACE(TXT,'(\([^()]*)(\()([^()]+)(\))([^()]*)(\))','\1\3\5\6') TXT
FROM T

 


by 불장작 [2019.10.10 10:12:44]

잘 되네요..답변 너무나 감사합니다.


by 마농 [2019.10.10 10:48:11]

괄호 안의 괄호를 모두 없애야 하는 거네요.
괄호는 2개 뿐인가요? 괄호가 3개 이상 나오는 경우는 없는지?


by jkson [2019.10.10 12:05:47]

불장작님 예시로만 생각했는데

괄호 안에 괄호를 모두 없앤다고 하면 정규식으로는 좀 어렵겠네요.

(abc(abc(abc(abc)abc)abc)abc), (abc(abc)abc(abc)abc(abc)abc), (abc(abc(abc)abc)abc(abc)abc(abc)abc) 이런 형태라고 한다면..


by jkson [2019.10.10 13:41:59]
WITH T AS
(
SELECT '(12345(678))' TXT FROM DUAL UNION ALL
SELECT 'abcde(12345)(6(7)8)' FROM DUAl UNION ALL
SELECT 'wrrt(12678(123)1234567)' FROM DUAL UNION ALL
SELECT 'wrrt(12678(123)123(4)567)' FROM DUAL UNION ALL
SELECT '((1234)5678012345)' FROM DUAL UNION
SELECT '(abc(abc(abc(abc)(a(b)c))abc)abc)' FROM DUAL UNION ALL
SELECT '(abc(abc)abc(abc)abc(abc)abc)' FROM DUAL UNION ALL
SELECT '(abc(abc(abc)abc)abc(abc)abc(abc)abc)' FROM DUAL UNION ALL
select '0(12(34))(56(7(8)01(23))45)' FROM DUAL
)
, T2(ORGTXT, BEFTXT, TXT) AS
(
SELECT TXT, '*', TXT
  FROM T
 UNION ALL
SELECT T2.ORGTXT, T2.TXT, REGEXP_REPLACE(TXT,'(\(|\))([^()]*)\(([^()]+)\)([^()]*)(\(|\))','\1\2\3\4\5') TXT
  FROM T2
 WHERE T2.BEFTXT != T2.TXT
)
SELECT ORGTXT, TXT
  FROM T2
 WHERE BEFTXT = T2.TXT 

by 마농 [2019.10.10 14:53:54]
WITH t AS
(
SELECT 1 pk, '0(12(34))(56(7(8)01(23))45)' v FROM dual --> 0(1234)(5678012345)
)
SELECT pk, v
     , LISTAGG(z) WITHIN GROUP(ORDER BY lv) x
  FROM (SELECT pk, v
             , lv
             , x, y
             , CASE WHEN x = '(' AND y != 1 THEN ''
                    WHEN x = ')' AND y != 0 THEN ''
                    ELSE x END z
          FROM (SELECT pk, v
                     , lv
                     , SUBSTR(v, lv, 1) x
                     , SUM(DECODE(SUBSTR(v, lv, 1), '(', 1, ')', -1, 0))
                       OVER(PARTITION BY pk ORDER BY lv) y
                  FROM t
                     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
                 WHERE lv <= LENGTH(v)
                )
        )
 GROUP BY pk, v
;

 


by jkson [2019.10.10 15:45:01]

좋은 방법이네요. 마농님 테스트 케이스 보니 제가 생각 못한 부분이 있었네요.

저도 쿼리 수정했습니다ㅎㅎ

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