WM_CONCAT을 이용한 중복 문자에 대한 질문좀 하겠습니다 0 9 2,439

by db_chosim [Oracle 기초] [2020.08.08 17:54:01]


SELECT REPLACE(WM_CONCAT(DISTINCT(SUBSTR(STR,LEVEL,1))),',') STR

FROM (SELECT 'ABCABCABEABDABAB' STR FROM DUAL)

CONNECT BY LEVEL <= 20

;

 

위 쿼리를 참고해서 중복문자 제거하는 쿼리를 만들고 있습니다.

근데 출력건수가 100건이 넘어가면 오류 메세지 :  ORA-22922 : 존재하지 않는 LOB 값이라는 에러가 나옵니다.

혹시 이러한 에러를 처리하려면 어떻게 해야하나요 ?

찾아본거로는 TO_CHAR로 감싸주면 된다는데 저는 해결이 되지 않았습니다 ㅠㅠ.

아니면 출력물이 AAABBBCC 로 나오는걸 ABC로 중복제거하는 방법을 알려주시면 감사하겠습니다.

부탁드리겠습니다.

by 우리집아찌 [2020.08.10 10:17:51]

http://gurubee.net/article/55512

연결된 문자열이 4000자 넘어서 그런것 같은데요. 

위 링크 댓글 밑에 보시면 나옵니다.


by db_chosim [2020.08.10 10:45:50]

답변은 감사합니다. 근데 제가 AAABBBCC -> ABC로 중복제거를 해서 출력은 했는데요

이러한 ROW가 100건이 넘어가면 ORA-22922: nonexistent LOB value 이런 에러가 나옵니다.

SELECT 'AAABBBCC' FROM DUAL 을 조회하면 AAABBBCC가 나오지만

제가 원하는것은 SELECT WM_CONCAT(DISTINCT(SUBSTR('AAABBBCC', LEVEL, 1))) FROM DUAL CONNECT BY LEVEL <=5 이런식으로 해서

ABC가 조회가 되게하는것입니다. 근데 이러한 ROW가 100건이 넘어가는 조회가 발생하면 ORA-22922: nonexistent LOB value 에러가 나옵니다.

제가 설명을 잘 못하지만.. 이러한 문제도 4000자 오류가 맞나요?


by 우리집아찌 [2020.08.10 13:04:11]
-- LISTAGG 함수를 이용해보시겠어요?
-- 혹시 중복 걸러내는 원본이 4000자 넘지는 않겠지요?

SELECT LISTAGG(V,',') WITHIN GROUP ( ORDER BY V ) V2
  FROM (SELECT DISTINCT SUBSTR(STR, LEVEL, 1) V
          FROM (SELECT 'ABCABCABEABDABAB' STR FROM DUAL)
        CONNECT BY LEVEL <= 20
        )

 


by db_chosim [2020.08.10 13:08:48]

아 제가 이걸 안올려놨었네요. 죄송한데 11G 이전 버전이라 LISTTAGG함수는 사용이 불가능합니다..ㅠㅠ


by pajama [2020.08.10 14:25:41]

한단계 거치는 건 어떨까요? 맞게 이해한건지 모르겠네요.

INSERT INTO tab1 SELECT LPAD('ABC',20,'ABEABD') FROM DUAL CONNECT BY LEVEL <=100

SELECT WM_CONCAT(STR)
FROM (
SELECT DISTINCT SUBSTR(STR,LEVEL,1) STR
FROM tab1
CONNECT BY LEVEL <= 20
);

 


by 마농 [2020.08.14 10:58:30]

두가지 문제가 있어 보입니다.
1. Connect By level <= n 방식의 사용은 dual 과 같이 1 건의 자료에만 사용해야 합니다.
 - 여러건의 테이블에 직접 사용하면 안됩니다. http://gurubee.net/article/55635
2. LOB 데이터의 처리
 - 문자 함수는 LOB 을 처리하지 못하고 4000 byte 이하의 문자만 처리 가능합니다.
 - http://gurubee.net/article/55512
3. 문제 해결을 위해서는 정확한 정보가 필요합니다.
 - 실제 사용쿼리가 어떻게 되는지?
 - 실제 사용컬럼의 특성이 어떻게 되는지?


by db_chosim [2020.08.17 16:48:28]

마농님 쿼리는 제가 정리를 해서 없어졌는데 위 쿼리와 관련된 질문을 좀 하고싶습니다.

테이블을 표로 설명해드리겠습니다.

 

ONE TWO THREE FOUR ID
1
1
1
1

이런식으로 데이터를 가지고 있는 테이블이 있을때 ID 별로 날짜를 구하고 싶습니다.

위 데이터를 wm_concat을 사용하면 월월목목,화화수수,금금금금,월월월월 이렇게 나오는데

중복을 제거해서 월화수목금 이런식으로 가공하고싶습니다. 혹시 wm_concat 말고 다른 함수가 있는지나 다른 방법이 있는지 여쭤보고 싶습니다.

그리고 마지막으로 저 id가 하나가 아닌 여러개일경우로 설명해주시면 정말 감사하겠습니다.


by 마농 [2020.08.18 08:11:06]
WITH t AS
(
SELECT 1 id, '월' c1, '월' c2, '목' c3, '목' c4 FROM dual
UNION ALL SELECT 1, '화', '화', '수', '수' FROM dual
UNION ALL SELECT 1, '금', '금', '금', '금' FROM dual
UNION ALL SELECT 1, '월', '월', '월', '월' FROM dual
UNION ALL SELECT 2, '월', '월', '목', '목' FROM dual
UNION ALL SELECT 2, '화', '화', '수', '수' FROM dual
UNION ALL SELECT 2, '월', '월', '월', '월' FROM dual
)
SELECT id
     , WM_CONCAT(DISTINCT DECODE(lv, 1, c1, 2, c2, 3, c3, 4, c4)) c
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 4)
 GROUP BY id
;

 


by db_chosim [2020.08.19 11:55:12]

감사합니다!!!

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