将值拆分为多行

Split value into multiple rows

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

测试位置 (TABLE 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');

个数 (TABLE 2)

CREATE TABLE mavenmovies.numbers (
  n INT PRIMARY KEY);
INSERT INTO numbers VALUES (1),(2);

这是我要查询的内容

这是我目前查询的内容(见下面我当前的query/attempt)

我现在的query/attempt

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

我的问题

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

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

您的 table 数字是正确的。您应该首先添加更多行,使其匹配(或超过)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):

id | State   | name                                    | name        
-: | :------ | :-------------------------------------- | :-----------
 1 | Alabama | Birmingham;Huntsville;Mobile;Montgomery | Birmingham  
 1 | Alabama | Birmingham;Huntsville;Mobile;Montgomery | Huntsville  
 1 | Alabama | Birmingham;Huntsville;Mobile;Montgomery | Mobile      
 1 | Alabama | Birmingham;Huntsville;Mobile;Montgomery | Montgomery  
 2 | Florida | Tampa;Jacksonville;Destin               | Tampa       
 2 | Florida | Tampa;Jacksonville;Destin               | Jacksonville
 2 | Florida | Tampa;Jacksonville;Destin               | Destin      

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