微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将值分成多行

如何解决将值分成多行

以下是我在数据库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);

这就是我要查询内容

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):

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?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。