반응형

특정 문자열에 데이터가 ','를 기준으로 들어가고 개수는 3개까지 제한되어 들어가지만 1개가 들어갈지 2개가 들어갈지 비어있을지 모르는 상황에서 해당 데이터를 쪼개고 JOIN을 하던지 SubQuery를 날리던지 해야하는 상황이였다.

 

쉽게 설명하자면 위 그림과 같은 상황이였다.

 

각각 컬럼별로 쪼개어 넣으면 좋았겠지만, 기존 프로젝트 구조 설계도 이런 기능이 지원되지 않는 상황이였고 어거지로 집어넣었기때문에 개수는 3개제한인점을 활용하여 각각 특수문자를 비교하고 서브쿼리를 통해 처리하기로 하였다.

 

처리한 방법

1. 먼저 구분자값인 ','의 개수가 몇개인지 파악할 필요가 있었다.

SELECT 
    SUM((CHAR_LENGTH(column)-CHAR_LENGTH(REPLACE(column,',',''))+1))
FROM TABLENAME

해당 쿼리를 사용하면 특정 데이터의 특수문자나 문자열등의 개수를 체크할수 있다.

 

사용예시)

 

2. 다음 해당 개수에 따른 CASE WHEN문을 통해 비교후 SPLIT 하였다.

각각 SPLIT된 데이터의 이름값을 concat_ws메소드를 통해 문자열을 다시 합쳐주었다.

SELECT
  CASE 
      SUM((CHAR_LENGTH(column)-CHAR_LENGTH(REPLACE(column,',',''))+1))

  #1개라면 특정테이블에서 바로 조회해온다.
  WHEN 1 THEN (SELECT columnName FROM R_FILEUPLOAD    WHERE no = column)

  #2개라면 ,기준으로 1개만 자른값을 비교하여 넣고
  #        2번째까지 가져오고 문자열을 합치다.
  WHEN 2 THEN (SELECT concat_ws(
      ','
      ,(select columnName from R_FILEUPLOAD 
      where no = SUBSTRING_INDEX(column, ',', 1))
      ,(select columnName from R_FILEUPLOAD
      where no = SUBSTRING_INDEX(SUBSTRING_INDEX(column, ',', 2), ',', -1))
  ))

  #3개라면 ,기준으로 1개만 자른값을 비교하여 넣고
  #        2번째까지 가져오고
  #        3번째까지 가져와서 문자열을 합친다.
  WHEN 3 THEN (SELECT concat_ws(
      ','
      ,(select columnName from R_FILEUPLOAD 
      where no = SUBSTRING_INDEX(column, ',', 1))
      ,(select columnName from R_FILEUPLOAD 
      where no = SUBSTRING_INDEX(SUBSTRING_INDEX(column, ',', 2), ',', -1))
      ,(select columnName from R_FILEUPLOAD 
      where no = SUBSTRING_INDEX(SUBSTRING_INDEX(column, ',', 3), ',', -1))
  ))
  END as REAL_NAME;

결과 데이터는 '테스트1,테스트2,테스트3' 의 형태로 처리되었다.

 

어쩔수 없는 상황에 임시대처로 해당방법을 사용하였고... 어지간하면 컬럼별로 쪼개어서 조인을 하는게 맞는것 같다...

저런형태로되면 나중에 볼때 기억도 안날것같고... 유지보수도 어려울것 같... ㅜㅠ

반응형