【发布时间】:2016-10-27 15:53:42
【问题描述】:
我有一个名为 articles 的表,其中包含以下格式的数据:
id|categories
--+----------
1|123,13,43
2|1,3,15
3|9,17,44,18,3
出于测试目的,您可以使用以下 SQL 命令创建此表:
CREATE TABLE articles(id INTEGER PRIMARY KEY, categories TEXT);
INSERT INTO articles VALUES(1, '123,13,43'), (2, '1,3,15'), (3, '9,17,44,18,3');
现在我想拆分categories 列的值,以便得到如下表:
id|category
--+--------
1|123
1|13
1|43
2|1
2|3
2|15
3|9
3|17
3|44
3|18
3|3
如您所见,我想将原始表带入First normal form。
我已经知道如何从this 答案中以这种方式仅拆分 一个 行。下面的代码示例只取第二行(即 id=2 的那一行)并以所需的方式拆分它们:
WITH split(article_id, word, str, offsep) AS
(
VALUES
(
2,
'',
(SELECT categories FROM articles WHERE id=2),
1
)
UNION ALL
SELECT
article_id,
substr(str, 0, CASE WHEN instr(str, ',') THEN instr(str, ',') ELSE length(str)+1 END),
ltrim(substr(str, instr(str, ',')), ','),
instr(str, ',')
FROM split
WHERE offsep
) SELECT article_id, word FROM split WHERE word!='';
当然这是非常不灵活的,因为文章 ID 需要硬编码。所以,现在我的问题是:我必须在上面的 SQLite 代码中添加或更改什么才能使其对所有行进行操作并输出所需的结果?
【问题讨论】:
-
真的必须在 SQL 中完成吗(也许“是”,只是验证)?你能在 bash 上做到这一点吗?
-
@DuduMarkovitz 我不认为使用 bash 会很好...而且我这样做是为了娱乐/教育目的,所以学习 SQL 方法会更好。
-
一个班轮 awk 就可以解决问题。这个网站有很多类似的问题。 SQLite 不适合这项工作。