[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 |
'Yame Programmer > SQL' 카테고리의 다른 글
[MSSQL] 값이 존재하는지 확인 후 update insert [EXISTS] 활용 (0) | 2016.08.12 |
---|---|
[Mybatis] 비교연산자 부등호 >,< 안될때 (11) | 2016.07.19 |
[mysql,MariaDB] 150 mysql foreign key constraint is incorrectly formed (0) | 2016.07.18 |
[MySql,MariaDB] Like in 같이 쓰기 해결책 REGEXP (8) | 2016.07.13 |
[MSSQL] 다른 테이블과 조인 걸고 삭제[delete] 하기, 삭제 조건에 조인 걸기 (4) | 2016.06.15 |