【问题标题】:Split value into multiple rows将值拆分为多行
【发布时间】:2020-12-19 19:31:36
【问题描述】:

以下是我在数据库mavenmovies中的两张表。

testLocation(表 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);

这是我要查询的

这是我当前查询的内容(请参阅下面我当前的查询/尝试)

我当前的查询/尝试

select
  testLocation.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(testLocation.name, ';', numbers.n), ';', -1) name
from
    numbers, testLocation;

我的问题

如何扩展我的查询以处理每行未知数量的分隔值?例如,一行可能有四个、二十个或零个分隔值。

感谢大家提供的任何指导。

【问题讨论】:

  • MySQL。我很抱歉。谢谢!
  • 这是一个糟糕的 SQL 设计。
  • @nacho 我没有设计数据库,但感谢您指出这一点。
  • 将 zje 列拆分为行。当你搜索 mysql split comma separatef 你会发现很多例子
  • 你的 MySQL 服务器的 PRECISE 版本是多少?

标签: mysql sql string csv unnest


【解决方案1】:

你在数字表的正确轨道上。您应该从添加更多行开始,使其匹配(或超过)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 |佛罗里达 |坦帕;杰克逊维尔;德斯廷 |坦帕 2 |佛罗里达 |坦帕;杰克逊维尔;德斯廷 |杰克逊维尔 2 |佛罗里达 |坦帕;杰克逊维尔;德斯廷 |德斯廷

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

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2021-12-07
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多