복붙노트

[SQL] MySQL은 : 분할 쉼표는 여러 행으로 구분 된 목록

SQL

MySQL은 : 분할 쉼표는 여러 행으로 구분 된 목록

I는 다른 테이블에 외래 키 콤마 분리 된리스트를 포함하는 컬럼을 갖는 테이블이 표준화 :

+----------+-------------+   +--------------+-------+
| part_id  | material    |   | material_id  | name  |
+----------+-------------+   +--------------+-------+
|      339 | 1.2mm;1.6mm |   |            1 | 1.2mm |
|      970 | 1.6mm       |   |            2 | 1.6mm |
+----------+-------------+   +--------------+-------+

나는 검색 엔진 제공한다는 절차 적 언어로이 데이터를 읽고 싶어.

그러니 할 수있는 방법은이 칼럼에 가입하거나이 데이터에 대한 쿼리를 실행할이 그 새 테이블에 삽입 적절한 항목을? 결과 데이터는 다음과 같이한다 :

+---------+-------------+
| part_id | material_id |
+---------+-------------+
|     339 |           1 |
|     339 |           2 |
|     970 |           2 |
+---------+-------------+

DBMS에 테이블을 반환하는 기능을 지원하는 경우 나는 해결책 생각할 수 있지만, MySQL은 분명히하지 않습니다.

해결법

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

    1.MySQL의에서 이것은 다음과 같이 얻을 수있다

    MySQL의에서 이것은 다음과 같이 얻을 수있다

    SELECT id, length FROM vehicles WHERE id IN ( 117, 148, 126) 
    
    +---------------+
    | id  | length  |
    +---------------+
    | 117 | 25      |
    | 126 | 8       |
    | 148 | 10      |
    +---------------+
    
    SELECT id,vehicle_ids FROM load_plan_configs WHERE load_plan_configs.id =42
    
    +---------------------+
    | id  | vehicle_ids   |
    +---------------------+
    | 42  | 117, 148, 126 |
    +---------------------+
    

    이제 쉼표의 길이를 얻을 vehicle_ids 쿼리 아래의 사용 구분

    Output
    
    SELECT length 
    FROM   vehicles, load_plan_configs   
    WHERE  load_plan_configs.id = 42 AND FIND_IN_SET(
           vehicles.id, load_plan_configs.vehicle_ids
    )
    
    +---------+
    | length  |
    +---------+
    | 25      |
    | 8       |
    | 10      |
    +---------+
    

    추가 정보를 보려면 다음 사이트를 방문 http://amitbrothers.blogspot.in/2014/03/mysql-split-comma-separated-list-into.html

  2. ==============================

    2.나는 많은 일 등 두 개의 유사한 질문에 대한 답변하지만 사람들은 커서의 사용에 의해 연기되는 생각 때문에하지 어떤 응답을했지만,이 과정 떨어져 일을해야 나는 개인적으로 그 문제를 생각 해달라고했습니다.

    나는 많은 일 등 두 개의 유사한 질문에 대한 답변하지만 사람들은 커서의 사용에 의해 연기되는 생각 때문에하지 어떤 응답을했지만,이 과정 떨어져 일을해야 나는 개인적으로 그 문제를 생각 해달라고했습니다.

    아직 MySQL을 나던 지원 테이블 반환 형식을 언급 한 바와 같이 그래서 당신은 테이블 루프 이외의 약간의 옵션을 가지고 재료 CSV 문자열을 구문 분석하고 부품 및 자재에 해당하는 행을 생성합니다.

    다음 게시물이 관심을 증명할 수 있습니다 :

    포스트 PHP는 MySQL을위한 분할 키워드

    다른 테이블에 테이블을 준비에서 부하 데이터를 MySQL의 절차. 그 과정에서 다중 값 필드를 분할해야

    RGDS

  3. ==============================

    3.MySQL은 임시 테이블 재사용이없는 및 기능 행을 반환하지 않습니다.

    MySQL은 임시 테이블 재사용이없는 및 기능 행을 반환하지 않습니다.

    내가 MySQL의에서 내 자신을 썼다 그래서 나는 행으로 CSV 정수의 변환 문자열에 스택 오버플로에서 아무것도 찾을 수 없습니다.

    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS str_split $$
    CREATE PROCEDURE str_split(IN str VARCHAR(4000),IN delim varchar(1))
    begin
    DECLARE delimIdx int default 0;
    DECLARE charIdx int default 1;
    DECLARE rest_str varchar(4000) default '';
    DECLARE store_str varchar(4000) default '';
    
    create TEMPORARY table IF NOT EXISTS ids as (select  parent_item_id from list_field where 1=0);
    truncate table ids;
    set @rest_str = str;
    set  @delimIdx = LOCATE(delim,@rest_str);
    set @charIdx = 1;
    set @store_str = SUBSTRING(@rest_str,@charIdx,@delimIdx-1);
    set @rest_str = SUBSTRING(@rest_str from @delimIdx+1);
    
    if length(trim(@store_str)) = 0   then
        set @store_str = @rest_str;
    end if;    
    
    
    INSERT INTO ids
    SELECT (@store_str + 0);
    
    WHILE @delimIdx <> 0 DO
        set  @delimIdx = LOCATE(delim,@rest_str);
        set @charIdx = 1;
        set @store_str = SUBSTRING(@rest_str,@charIdx,@delimIdx-1);
        set @rest_str = SUBSTRING(@rest_str from @delimIdx+1);
    
    select @store_str;
        if length(trim(@store_str)) = 0   then
            set @store_str = @rest_str;
        end if;    
        INSERT INTO ids(parent_item_id)
        SELECT (@store_str + 0);
    END WHILE;
    
    select parent_item_id from ids;
    end$$
    DELIMITER ;
    
    call str_split('1,2,10,13,14',',')
    

    당신의 int를 사용하지 않는 경우에도 다른 유형에 캐스팅해야합니다.

  4. ==============================

    4.또한 정규 표현식을 사용할 수 있습니다

    또한 정규 표현식을 사용할 수 있습니다

    SET @materialids=SELECT material FROM parttable where part_id=1;
    SELECT * FROM material_id WHERE REGEXP CONCAT('^',@materialids,'$');
    

    당신이 한 부분을 취득하고자 할 때 도움이 될 것입니다. 물론 안 전체 테이블

  5. from https://stackoverflow.com/questions/3936088/mysql-split-comma-separated-list-into-multiple-rows by cc-by-sa and MIT license