1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | WITH TMP AS ( SELECT REPLACE ( 'aaa' || CHR(10) || CHR(10) || CHR(10) || 'bbb' || CHR(10) || CHR(10) || CHR(10) || CHR(10) || 'ccc' || CHR(10) || 'ddd' || CHR(10) || CHR(10) || CHR(10) || 'eee' , CHR(10), '▨ ' ) TXT --> 줄바꿈 문자를 잘 사용 안하는 문자로 대체 FROM DUAL ) SELECT REPLACE (LISTAGG(TXT2) WITHIN GROUP ( ORDER BY RN) , '▨' , CHR(10)) AS TXT FROM ( SELECT RN , TXT , LAG_TXT , CASE WHEN TXT = LAG_TXT THEN '' ELSE TXT END TXT2 FROM ( SELECT ROWNUM RN , TRIM(REGEXP_SUBSTR(TXT, '[^▨]+' , 1, ROWNUM)) || '▨' TXT , LAG(TRIM(REGEXP_SUBSTR(TXT, '[^▨]+' , 1, ROWNUM)) || '▨' ) OVER ( ORDER BY ROWNUM) LAG_TXT --, LEAD(TRIM(REGEXP_SUBSTR(TXT,'[^▨]+', 1, ROWNUM)) || '▨') OVER (ORDER BY ROWNUM) LEAD_TXT FROM TMP CONNECT BY ROWNUM <= LENGTH(REGEXP_REPLACE(TXT, '[^▨]+' )) + 1 ) ) WHERE TXT2 IS NOT NULL ; 이렇게 해보았는데 마지막 eee 처리가 안되네요... |
줄바꿈이 CHR(13)||CHR(10) 두개 조합으로 이루어 졌다고 가정하면
거꾸로 조합된 CHR(10)||CHR(13) 을 지우면 됩니다.
1310131013101310
1 2 3 4 5 6 7 8 9 10 11 12 13 | WITH t AS ( SELECT 'aaa' || CHR(13)||CHR(10) || CHR(13)||CHR(10) || 'bbb' || CHR(13)||CHR(10) || CHR(13)||CHR(10) || CHR(13)||CHR(10) || 'ccc' || CHR(13)||CHR(10) || 'ddd' || CHR(13)||CHR(10) || CHR(13)||CHR(10) || 'eee' txt FROM dual ) SELECT txt , REPLACE (txt, CHR(10)||CHR(13)) x FROM t ; |
와우....머리를 띵 치네요~~~
마농님 만약 위에서 제가 한것 처럼 동일 값이 연속일 경우 2개(?)까지만 허용인 경우 에는 어떻게 해야 할까요??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | WITH TMP AS ( SELECT REPLACE ( 'aaa' || CHR(10) || CHR(10) || CHR(10) || 'bbb' || CHR(10) || CHR(10) || CHR(10) || CHR(10) || 'ccc' || CHR(10) || 'ddd' || CHR(10) || CHR(10) || CHR(10) || 'eee' , CHR(10), '▨ ' ) TXT --> 줄바꿈 문자를 잘 사용 안하는 문자로 대체 FROM DUAL ) SELECT ROWNUM RN , TRIM(REGEXP_SUBSTR(TXT, '[^▨]+' , 1, ROWNUM)) || '▨' TXT --, LAG(TRIM(REGEXP_SUBSTR(TXT,'[^▨]+', 1, ROWNUM)) || '▨') OVER (ORDER BY ROWNUM) LAG_TXT --, LEAD(TRIM(REGEXP_SUBSTR(TXT,'[^▨]+', 1, ROWNUM)) || '▨') OVER (ORDER BY ROWNUM) LEAD_TXT --, ROW_NUMBER() OVER (PARTITION BY TRIM(REGEXP_SUBSTR(TXT,'[^▨]+', 1, ROWNUM)) || '▨' ORDER BY ROWNUM) CNT FROM TMP CONNECT BY ROWNUM <= LENGTH(REGEXP_REPLACE(TXT, '[^▨]+' )) + 1 ; |
다음과 같은 데이터에서
RN | TXT | 원하는값 | 또는 |
1 | aaa▨ | 1 | 1 |
2 | ▨ | 2 | 1 |
3 | ▨ | 3 | 2 |
4 | bbb▨ | 1 | 1 |
5 | ▨ | 2 | 1 |
6 | ▨ | 3 | 2 |
7 | ▨ | 4 | 3 |
8 | ccc▨ | 1 | 1 |
9 | ddd▨ | 1 | 1 |
10 | ▨ | 2 | 1 |
11 | ▨ | 3 | 2 |
12 | eee▨ | 1 | 1 |
저런식의 값을 부여할 수 있을까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | -- To. 동동동 -- WITH tmp AS ( SELECT 'aaa' || CHR(10) || CHR(10) || CHR(10) || 'bbb' || CHR(10) || CHR(10) || CHR(10) || CHR(10) || 'ccc' || CHR(10) || 'ddd' || CHR(10) || CHR(10) || CHR(10) || 'eee' txt FROM dual ) SELECT txt , REGEXP_REPLACE(txt, CHR(10)|| '{2,}' , CHR(10)||CHR(10)) X FROM tmp ; |