mysql - 将值拆分为多行

标签 mysql sql string csv unnest

以下是我在数据库中的两个表 mavenmovies .
测试位置( 表 1 )

CREATE TABLE mavenmovies.testLocation (
    id INT AUTO_INCREMENT PRIMARY KEY,
    State varchar(255),
    name varchar(255)
);
INSERT INTO testLocation (State, name)
VALUES 
('Alabama','Birmingham;Huntsville;Mobile;Montgomery'),
('Florida','Tampa;Jacksonville;Destin');
数字 ( 表 2 )
CREATE TABLE mavenmovies.numbers (
  n INT PRIMARY KEY);
INSERT INTO numbers VALUES (1),(2);
这是我要查询的
enter image description here
这是我目前查询的内容(请参阅下面的当前查询/尝试)
enter image description here
我当前的查询/尝试
select
  testLocation.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(testLocation.name, ';', numbers.n), ';', -1) name
from
    numbers, testLocation;
我的问题
如何扩展我的查询以处理每行未知数量的分隔值?例如,一行可能有四个、二十个或零个分隔值。
感谢大家提供的任何指导。

最佳答案

您在数字表的正确轨道上。您应该首先添加更多行,以便它匹配(或超过)CSV 列表中的最大可能元素数。
然后,您可以使用连接条件仅生成每个名称的相关行数

select
    t.*,
    substring_index(substring_index(t.name, ';', n.n), ';', -1) name
from numbers n
inner join testLocation t   
    on n <= length(t.name) - length(replace(t.name, ';', '')) + 1
Demo on DB Fiddle (我将数字扩展为 8 ):
身份证 |状态 |姓名 |姓名
-: | :------ | :-------------------------------------- | :-----------
1 |阿拉巴马州 |伯明翰;亨茨维尔;莫比尔;蒙哥马利 |伯明翰
1 |阿拉巴马州 |伯明翰;亨茨维尔;莫比尔;蒙哥马利 |亨茨维尔
1 |阿拉巴马州 |伯明翰;亨茨维尔;莫比尔;蒙哥马利 |移动的
1 |阿拉巴马州 |伯明翰;亨茨维尔;莫比尔;蒙哥马利 |蒙哥马利
2 |佛罗里达 |坦帕; jackson 维尔;德斯廷 |坦帕
2 |佛罗里达 |坦帕; jackson 维尔;德斯廷 | jackson 维尔
2 |佛罗里达 |坦帕; jackson 维尔;德斯廷 |德斯坦

请注意,正如其他人已经评论过的那样,将 CSV 列表存储在数据库中是一种不好的做法,几乎总是应该避免。推荐相关阅读:Is storing a delimited list in a database column really that bad?

关于mysql - 将值拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63674880/

相关文章:

mysql - 选择语句查询以排除具有重复值的行

php - 使用 PHP 对不同字段的 mysql 输出进行排序

php - 我有逗号分隔的列,需要在 mysql 中从它们中获取最常见的值

python - 为什么我的查询在参数化时会中断?

mysql - 找到一对参加完全相同类(class)的学生

c - 为结构体中的字符数组赋值

php - 新的 html5 canvas 属性与 javascript 交互

mysql - 具有多行值的子查询选择

iphone - 从 NSURL 中获取字符串

Javascript从字符串中提取值