我正在使用堆栈溢出的数据转储,并且在帖子中,有一个列(type:String)用于标记,它采用以下形式:
"<apache><tomcat><java><httpd><virtualhost>"
如何将SQL拆分为单独的行?
所以我有一个这样的结果表:
ID | Tag
--------------------
1 | apache
2 | tomcat
3 | java
4 | httpd
5 | virtualhost
答案 0 :(得分:2)
你可以用这样的逻辑打破这一点:
select replace(replace(substring(substring_index(col, '><', n), '><', -1), '<', ''), '>', '')
from (select 1 as n union all select 2 union all select 3 select 4 union all select 5
) n join
table t
on length(col) - replace(length(replace(col, '>' '') <= n.n
select
中的逻辑基本上是从列表中提取第n个项目。它还会从值中删除<
和>
。
连接中的逻辑是获取第n个元素的数字。
答案 1 :(得分:0)
您的转储是否包含Stack Overflow标记的完整列表?如果是这样,那么我会把它们放在一个单独的表中并执行以下操作:
SET @row_number:=0;
SELECT @row_number:=@row_number+1 AS ID, t1.Tag
FROM tag_table t1 INNER JOIN post_table p1
WHERE p1.tags LIKE CONCAT('%<', t1.tag, '>%')
AND p1.PostID = <whatever the post ID is>;