TEXT 형태 컬럼 Split 기능 만들어보기
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, ",", "" ) )
- 자료출처