컬럼 값에 엔터가 여러개 있을 때 하나만 남기고 없애고 싶은데 잘 되질 않네요
계속해서 여러 번 repalce(chr(10))로 감싸는거 말고 정규식으로 할 수 있는 방법이 있을까요?
될듯 도 한데 어렵네요 고수님들의 지도 부탁드립니다.
데이터 =>
aaa
bbb
ccc
--------------
결과 =>
aaa
bbb
ccc
-- 손으로 옮겨써서 오타 있을수 있어요.
WITH T (V) AS (
SELECT 'AAA' || CHR(10) || CHR(10) || CHR(10) || 'BBB' || CHR(10) ||CHR(10) ||'CCC'
FROM DUAL
)
SELECT V
, REGEXP_REPLACE(
( REPLACE(REPLACE(V,CHR(10),'|',CHR(13),'|'))
, '[|]+', CHR(10)) V2
FROM T
줄바꿈을 표의 Row로 해본다면
| 원본 | 결과 | |
| TXT | TXT | |
| aaa | aaa | |
| bbb | ||
| bbb | ||
| ccc | ||
| ddd | ||
| ccc | eee | |
| ddd | ||
| eee |
이렇게 되기를 원하시는 건가요? 줄바꿈이 두개 이상 연속일시 두개 까지만?
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
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개(?)까지만 허용인 경우 에는 어떻게 해야 할까요??
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 |
저런식의 값을 부여할 수 있을까요?
-- 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
;
와우 마농님 답변 감사드립니다...엄청 심플하게 되네요...
감사합니다...
역시 역시 퇴근해서 식사 하고 이제야 봤습니다.
제 질문의 답변을 마지막 부분에 주셨습니다. 그리고 다들 비슷한 의문들이 같이 해소 된듯합니다.
실제로 테이블 특정 컬럼의 값에 엔터값이 불특정(n개)가 들어가 있습니다. 그걸 모두 없애고 chr(10)가 여러개 인걸 2개로(CHR(10)||CHR(10))만 만들어야 했거든요
마지막 마농님의 답변이 제가 원하는 답변 이었습니다. 다시 한번 감사 합니다.
다시 한번 배워 갑니다. 일교차 심한데 다들 감기 조심 하세요