여러개의 엔터를 하나만 남기기 1 8 3,103

by 구사일생 [SQL Query] 엔터제거 중복제거 [2023.02.22 20:22:52]


컬럼 값에 엔터가 여러개 있을 때 하나만 남기고 없애고 싶은데 잘 되질 않네요

계속해서 여러 번 repalce(chr(10))로 감싸는거 말고 정규식으로 할 수 있는 방법이 있을까요?

될듯 도 한데 어렵네요 고수님들의 지도 부탁드립니다.

데이터 =>

aaa

 

 

bbb

 

 

 

 

ccc

 

 

--------------

결과 =>

aaa

 

bbb

 

ccc

by 우리집아찌 [2023.02.23 10:14:00]
-- 손으로 옮겨써서 오타 있을수 있어요.
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

 


by 동동동 [2023.02.23 10:27:28]

 

줄바꿈을 표의 Row로 해본다면

원본   결과
TXT   TXT
aaa aaa
   
  bbb
bbb  
  ccc
  ddd
   
ccc eee
ddd  
 
 
eee

이렇게 되기를 원하시는 건가요? 줄바꿈이 두개  이상 연속일시 두개 까지만?


by 동동동 [2023.02.23 11:04:30]
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 처리가 안되네요...

 


by 마농 [2023.02.23 12:55:22]

줄바꿈이 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
;

 


by 동동동 [2023.02.23 13:31:29]

와우....머리를 띵 치네요~~~

마농님 만약 위에서 제가 한것 처럼 동일 값이 연속일 경우 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

 

저런식의 값을 부여할 수 있을까요?


by 마농 [2023.02.23 17:32:57]
-- 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
;

 


by 동동동 [2023.02.23 18:19:51]

와우 마농님 답변 감사드립니다...엄청 심플하게 되네요...

감사합니다...


by 구사일생 [2023.02.23 21:01:28]

역시 역시  퇴근해서 식사 하고 이제야 봤습니다.

제 질문의 답변을 마지막 부분에 주셨습니다. 그리고 다들 비슷한 의문들이 같이 해소 된듯합니다.

실제로 테이블 특정 컬럼의 값에 엔터값이 불특정(n개)가 들어가 있습니다. 그걸 모두 없애고 chr(10)가 여러개 인걸 2개로(CHR(10)||CHR(10))만 만들어야 했거든요

마지막 마농님의 답변이 제가 원하는 답변 이었습니다. 다시 한번 감사 합니다.

다시 한번 배워 갑니다. 일교차 심한데 다들 감기 조심 하세요

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