DATA 전문가로 가는 길

[SQL] MariaDB/Mysql 구분자(콤마, 파이프라인 등등)를 기준으로 열(row) 변환 본문

Data Architecture/SQL Query

[SQL] MariaDB/Mysql 구분자(콤마, 파이프라인 등등)를 기준으로 열(row) 변환

EstenPark 2017. 2. 16. 16:04

MaraiDB 또는 Mysql에서 구분자로 넘어온 값을 다시 열로 변환(테이블)하는 방법을 해보려고 합니다. 쿼리를 작성할 때 100개 미만의 데이터 셋은 where절에 IN(..)절을 이용해서 전달하면 되지만, 1,000개, 10,000개 많은 양의 데이터를 조작하고자 할 때는 불편하게 됩니다. 또는 XML, CSV 파일의 행을 열로 바꾸고 행의 데이터를 열로 보고자 할 때 유용합니다.


1. 구분자 자르기를 이용해서 열로 변경하는 쿼리

/* 1. 사용자 변수 */
SET @IN_DELIMITER = '|';
SET @IN_DATA = '10|20|30||40|50||70|80|||90';

/* 구분자를 기준으로 로우(ROW) 데이터 생성 쿼리*/
SELECT    TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(A.DATA, @IN_DELIMITER, B.RN), @IN_DELIMITER, -1)) AS ROW_DATA
FROM      (SELECT    CASE
                       WHEN CONVERT((LENGTH(A.DATA) - LENGTH(REPLACE(A.DATA, @IN_DELIMITER, ''))) / LENGTH(','), UNSIGNED) > 0 THEN 
                         CONVERT((LENGTH(A.DATA) - LENGTH(REPLACE(A.DATA, @IN_DELIMITER, ''))) / LENGTH(',') + 1, UNSIGNED)
                       ELSE 0
                     END
                       AS DELIMITER_CNT
                    ,A.DATA
           FROM      (SELECT    @IN_DATA AS DATA) A) A /* [조건] 데이터 입력 */
          INNER JOIN (SELECT    CAST(seq AS INT) as RN FROM seq_1_to_1000) B ON (B.RN <= A.DELIMITER_CNT)
;



2. 데이터 결과




3. 열(Row) -> 행(Column) 변경(구분자)

SELECT   GROUP_CONCAT(A.SEQ) AS DATA
FROM     seq_1_to_10 A
;



Comments