[MySql] , [MaraiaDB] 한로우에 있는 값을 구분자를 이용해 여러 로우로 출력하는 방법.



text_column 

개발자,연봉,올려줘,야근,하기,싫어



한 컬럼 한 로우에 값이 위와 같이 있을떄


기본적으로 출력을 하면 하나의 로우로 출력을 하게 된다.


만약 저 택스트를


text_column 

개발자 

연봉 

올려줘 

야근 

하기 

싫어 




위와 같은 여러줄의 로우로 출력을 하고 싶을때가 있다.


그럴때 사용하는 쿼리는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
 
select
   SUBSTRING_INDEX (SUBSTRING_INDEX(테이블명.컬럼영,'구분자',numbers.n),'구분자',-1) 컬럼명
          
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) numbers INNER  JOIN 테이블명
    on CHAR_LENGTH ( 테이블명 . 컬럼영 ) 
      - CHAR_LENGTH ( REPLACE ( 테이블명 . 컬럼영 ,  '구분자' ,  '' ))>= numbers . n-1
cs



방법을 몰라서 구글링하고 스택오버플로우를 뒤지다가 발견한 쿼리다.



답변을 달아준 peterm 에게 감사한다.


왜 위와 같은 쿼리를 사용했을때 로우를 나눠서 출력해주는지는 모르겠으나


추가적으로 발견한건


union all select 숫자 << 이 유니온 올 해준 개수만큼 구분자로 구별해 로우로 만들어 준다는 것을 알아냈다.


만약 유니온올을 3개만 했을땐  위의 결과값이


개발자

연봉

올려줘


까지 밖에 나오지 않는다.


아마도 유니언 all을 해서 여러 로우를 임의로 만들어 준다음


구분자로 분리시킨다음 해당 로우에 순서대로 넣어 주는것 같다.


저렇게 검색했을 경우 공백로우값도 함꼐 나타나게 되는데


그럴땐 조건문에 아래와같은 조건을 추가해주면 해결된다.


1
 WHERE SUBSTRING_INDEX ( SUBSTRING_INDEX ( SEARCH_TAG_HISTORY . SEARCH_TEXT ,  ' ' , numbers . n ),  ' ' ,  -1 ) != ' '
cs


+ Recent posts