为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL:将逗号分隔的列表分成多行

/ 猿问

MySQL:将逗号分隔的列表分成多行

慕村9548890 2019-12-05 14:44:30

我有一个未标准化的表,其中的列包含逗号分隔的列表,该列表是另一个表的外键:


+----------+-------------+   +--------------+-------+

| 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显然不支持,我可以想到一个解决方案。


查看完整描述

3 回答

?
qq_笑_17

在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


查看完整回答
反对 回复 2019-12-05
?
白衣染霜花

我已经在许多天内回答了两个类似的问题,但是没有任何回应,所以我想人们会因为使用光标而推迟,但是因为这应该是一个一次性的过程,所以我个人认为这并不重要。


如前所述,MySQL不支持表返回类型,因此除了循环表和解析材料csv字符串并为零件和材料生成适当的行外,您别无选择。


查看完整回答
反对 回复 2019-12-05
?
牛魔王的故事

MySQL没有临时表重用,并且函数不返回行。


我在Stack Overflow中找不到任何东西可以将csv整数字符串转换为行,因此我在MySQL中编写了自己的代码。


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',',')

如果不使用整数,则还需要转换为其他类型。

查看完整回答
反对 回复 2019-12-05

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信