한 컬럼내에서 중복 문자 확인 1 6 2,899

by 쭈니아빠 [SQL Query] 중복 중복문자 [2015.11.04 15:43:56]


안녕하세요.

하나의 컬럼내에서 중복된 문자가 존재하는지를 확인할 수 있는 SQL을 문의드립니다.

만일 아래와 같은 경우 중복된 결과가 1과 3이 나오도록 해야 하는데 부탁을 드립니다. 

데이터 건수가 대용량이라 프로시져내에서 FOR CURSOR문으로 처리하기도 애매한 상황입니다.

Column_ID  Column_B
   1           A,B,C,D,E
   2           A,A,B,D
   3           D,B,C,B,F
 

원하는 결과 ==> 중복된 ID는

1

3

감사합니다.

by swlee710 [2015.11.04 16:08:20]

2,3번이 나와야 하는거 아닌가요?


by 마농 [2015.11.04 16:12:22]
WITH t AS
(
SELECT 1 Column_ID, 'A,B,C,D,E' Column_B FROM dual
UNION ALL SELECT 2, 'A,A,B,D'   FROM dual
UNION ALL SELECT 3, 'D,B,C,B,F' FROM dual
)
-- 1. 값의 길이가 고정인 경우만 존재한다면?
SELECT column_id, column_b
  FROM t
 WHERE REGEXP_LIKE(column_b, '([^,]+).*\1')
;
WITH t AS
(
SELECT 1 Column_ID, 'A,B,C,D,E' Column_B FROM dual
UNION ALL SELECT 2, 'A,A,B,D'   FROM dual
UNION ALL SELECT 3, 'D,B,C,B,F' FROM dual
UNION ALL SELECT 3, 'A,B,C,D,CC,CCC' FROM dual    -- 요런거
)
-- 값의 길이가 가변일 경우가 존재한다면?
SELECT column_id, column_b
  FROM t
 WHERE REGEXP_LIKE(','||column_b||',', '(,[^,]+)(,[^,]+)*\1,')
;

 


by swlee710 [2015.11.04 16:29:59]
with t (Column_ID,Column_B) as (
select 1,'A,B,C,D,E' from dual union all
select 2,'A,A,B,D' from dual union all
select 3,'D,B,C,B,F' from dual )
select column_id
from (
      select column_id,column_b
            , row_number() over(partition by column_id,column_b,rs order by rs )rn
      from (
            select column_id,column_b, regexp_substr(column_b,'[^,]+',1,lv) rs
            from (
                  select column_id, column_b, regexp_count(column_b,',') rc,lv
                  from t,(select level lv from dual connect by level <=5))
      where rc + 1 >= lv))
where rn = 2;

 


by 쭈니아빠 [2015.11.04 16:30:45]

아...죄송합니다. 2번과 3번이 나와야 합니다. ^^;


by 쭈니아빠 [2015.11.04 16:44:15]

아...이렇게 간단히 되는군요.

값이 고정/가변적인 경우까지 상세히 알려주시고...^^

실제 값은 가변적입니다.

두 분께 머리숙여 다시한번 감사를 드립니다.


by 우리집아찌 [2015.11.04 18:04:34]
WITH t AS
(
SELECT 1 Column_ID, 'A,B,C,D,E' Column_B FROM dual
UNION ALL SELECT 2, 'A,A,B,D'   FROM dual
UNION ALL SELECT 3, 'D,B,C,B,F,CC,CCC' FROM dual
)


SELECT Column_ID , COUNT(B) CNT FROM 
(SELECT  Column_ID
     ,  REGEXP_SUBSTR (Column_B, '[^,]+', 1, LV) B
  FROM T , 
      (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 99)
WHERE REGEXP_COUNT(Column_B,',')+1 >= LV
) GROUP BY Column_ID , B HAVING COUNT(B) > 1

 

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