如何解决如何在列mysql中使用多个子索引拆分多个子值?
CREATE TABLE tablename (id INT,C1 text);
INSERT INTO tablename VALUES
(1,'[AU 1] string 1; [AU 2] string 2; [AU 3] string 3.1; string 3.2; [AU 4] string 4.1; string 4.2; [AU 5] string 5'),(2,'[AU 1; AU 2] string 1'),(3,'[AU 1] string 1; [AU 2] string 2');
CREATE TABLE numbers (n INT PRIMARY KEY);
INSERT INTO numbers VALUES (1),(2),(3),(4),(5),(6);
通过关注“@fthiella”和“@RGarcia”的例子,我得到了尽可能接近。
请参阅小提琴 here。
我得到的结果与“我想要这样的输出:”中的预期不同:
我想要这样的输出
| ID | AU | ORG |
| 1 |[AU 1]|string_1|
| 1 |[AU 2]|string_2|
| 1 |[AU 3]|string_3.1|
| 1 |[AU 3]|string_3.2|
| 1 |[AU 4]|string_4.1|
| 1 |[AU 4]|string_4.2|
| 1 |[AU 5]|string_5|
| 2 |[AU 1; AU 2]|string_1|
| 3 |[AU 1]|string_1|
| 3 |[AU 2]|string_2|
解决方法
WITH RECURSIVE
cte1 AS ( SELECT id,TRIM(TRAILING ';' FROM TRIM(SUBSTRING_INDEX(C1,'[',2))) one_group,SUBSTRING(C1 FROM LENGTH(SUBSTRING_INDEX(C1,2))) slack,1 ordinality_au
FROM test
UNION ALL
SELECT id,TRIM(TRAILING ';' FROM TRIM(SUBSTRING_INDEX(slack,2))),SUBSTRING(slack FROM LENGTH(SUBSTRING_INDEX(slack,ordinality_au + 1
FROM cte1
WHERE LOCATE('[',slack) ),cte2 AS ( SELECT id,CONCAT(SUBSTRING_INDEX(one_group,']',1),']') AU,TRIM(SUBSTRING_INDEX(one_group,-1)) ORG,ordinality_au
FROM cte1 ),cte3 AS ( SELECT id,AU,ordinality_au,SUBSTRING_INDEX(ORG,';',1) ORG,TRIM(TRIM(LEADING ';' FROM TRIM(LEADING SUBSTRING_INDEX(ORG,1) FROM ORG))) slack,1 ordinality_org
FROM cte2
UNION ALL
SELECT id,SUBSTRING_INDEX(slack,TRIM(TRIM(LEADING ';' FROM TRIM(LEADING SUBSTRING_INDEX(slack,1) FROM slack))),ordinality_org + 1
FROM cte3
WHERE TRIM(slack) != '' )
SELECT id,ORG
FROM cte3
ORDER BY id,ordinality_org;
https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=a3258f8f1cd92eca0c480ea6673f13f1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。