DB

TEXT 형태 컬럼 Split 기능 만들어보기

dev_beom_12 2020. 11. 26. 16:20
반응형

TEXT 형태로 , 구분자를 사용하여 값을 마구 때려넣는건 개발적으로 옳지 못한 경우지만

부득이하게 쓰여야할 경우에는 그만큼 불필요한 처리가 동반된다.

 

본인은 id값을 TEXT컬럼에 "," 구분자로 넣었으며 해당 구분자로 구분된 데이터는

B테이블의 키값이며 최종적으론 구분자로 구분된 데이터를 통해서

B테이블의 특정 값을 뽑아내는 용도로 해당 쿼리를 이용하였다.

 

 

text 테이블내에 names (TEXT) 라는 컬럼이 있다는 가정하에

값은 "123,6758,ㅇㄹ흏듀,ㅠ유,13414,wfafawef, .. " 등과 같이 매우 불규칙적으로

들어가 있다고 가정하자

 

- 해당 names의 문자 갯수를 확인하는 쿼리문

  • LENGTH(names)-LENGTH(REPLACE(names,",","")) as count

// 보다 상세한 설명과 문자열 길이, 갯수 관련 명령어를 설명은 생략합니다.

 

- names의 문자들을 다수의 튜플(레코드)로 가상테이블 구성 

  • 한 레코드 TEXT 컬럼의 값들을 배열화 시키는 작업
  • union all 을 이용하여 아래와 같이 구현할 수 있지만 동적인 처리에 있어서는 참조할 테이블이 필요하다.

SELECT  SUBSTRING_INDEX (SUBSTRING_INDEX(text.names,',',numbers.n),',',-1) namesVal

FROM 

   (SELECT  1 n union  all  SELECT 2  

    union  all  SELECT  3  union  all SELECT 4 

    union  all  SELECT  5  union  all  SELECT  6

    union  all  SELECT  7  union  all  SELECT  8 

    union  all  SELECT  9 union  all  SELECT  10

    union  all  SELECT  11 union  all  SELECT  12

    union  all  SELECT  13 union  all  SELECT  14

    union  all  SELECT  15 union  all  SELECT  16

    union  all  SELECT  17 union  all  SELECT  18) numbers 

INNER  JOIN text on CHAR_LENGTH ( text.names ) - CHAR_LENGTH ( REPLACE ( text.names ,  ',' ,  '' ))>= numbers.n-1

 

- 동적인 처리

SELECT text.names

FROM text AS t INNER JOIN text2 AS t2

ON 65535 - CHAR_LENGTH( REPLACE( t.names, ',', '' ) ) >= LENGTH( t.names ) - LENGTH( REPLACE( t.names, ",", "" ) )

 

 

- 자료출처

yamea-guide.tistory.com/entry/Mysql-%EA%B5%AC%EB%B6%84%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EA%B0%92%EC%9D%84-%EB%A1%9C%EC%9A%B0%EB%A1%9C-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0

 

[Mysql] 구분자를 이용해 값을 로우로 출력하기

[MySql] , [MaraiaDB] 한로우에 있는 값을 구분자를 이용해 여러 로우로 출력하는 방법. text_column 개발자,연봉,올려줘,야근,하기,싫어 한 컬럼 한 로우에 값이 위와 같이 있을떄 기본적으로 출력을 하

yamea-guide.tistory.com

 

반응형