복붙노트

[SQL] SQL 분할 쉼표로 구분 행 [중복]

SQL

SQL 분할 쉼표로 구분 행 [중복]

I는 콤마로 분리하는 가변 개수의 열을 가지고

somethingA,somethingB,somethingC
somethingElseA, somethingElseB

그리고 결과는 각각의 값을, 그리고 행을 만들려면 :

somethingA
somethingB
somethingC
somethingElseA
somethingElseB

어떻게 SQL에 (MySQL의)을이 작업을 수행 할 수 있습니까?

(I는 "내파"와 "측면보기"를 인터넷 검색을 해봤지만, 그 관련 질문을 설정하지 않는 것. 모든 관련 SO 질문은 훨씬 더 복잡한 일을하려고)

해결법

  1. ==============================

    1.이 같은 순수한 SQL로 작업을 수행 할 수 있습니다

    이 같은 순수한 SQL로 작업을 수행 할 수 있습니다

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
      FROM table1 t CROSS JOIN 
    (
       SELECT a.N + b.N * 10 + 1 n
         FROM 
        (SELECT 0 AS N UNION ALL SELECT 1 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) a
       ,(SELECT 0 AS N UNION ALL SELECT 1 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) b
        ORDER BY n
    ) n
     WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
     ORDER BY value
    

    참고 : 트릭 활용 집계 (숫자) 테이블이 경우 MySQL의 기능 SUBSTRING_INDEX에 매우 편리한이다 (). 당신이 이러한 쿼리 (분할)을 많이 할 경우에 당신은 채우고이 예에서와 같이 하위 쿼리와 함께 즉석에서 그것을 생성하는 대신 지속 집계 테이블을 사용하는 것이 좋습니다. 이 예에서 하위 쿼리를 효과적으로 당신이 소스 테이블에서 행 당 100 개 구분 된 값으로 분할 수 1 100에서 숫자의 시퀀스를 생성합니다. 당신이 더 많거나 적은 필요한 경우 쉽게 조정할 수 있습니다.

    산출:

    |          VALUE |
    |----------------|
    |     somethingA |
    |     somethingB |
    |     somethingC |
    | somethingElseA |
    | somethingElseB |
    

    여기 SQLFiddle 데모입니다

    이 조회가 지속 된 집계 테이블로 보일 수 있습니다 방법입니다

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
      FROM table1 t CROSS JOIN tally n
     WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
     ORDER BY value
    

    여기 SQLFiddle 데모입니다

  2. from https://stackoverflow.com/questions/19073500/sql-split-comma-separated-row by cc-by-sa and MIT license