将值拆分为多行
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?
以下是我在数据库中的两个表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?