有些时候需要把mysql中以特定分割的多列,转换成相对应的每行,如 mysql中的help_topic 字段 description ,
description 中以‘逗号’分割的多个函数,如果每个函数单独一行,该怎么做的,mysql中没有提供专门的列转行的函数,之只有行转列的函数(group_contact)
我们举例说明下:
首先,通过
SELECT
LENGTH(t1.description) - LENGTH(
REPLACE (t1.description, ',', '')
) + 1 AS a
FROM
mysql.help_topic t1
ORDER BY
a DESC
查询出要分割列的最大值,然后构造一个映射表,这个映射表的行数要大于分割‘列’的最大值
我们下面构造一个映射表,并向里面插入大于最大‘分割列’的行数
use test;
DROP TABLE if EXISTS assit;
create table assit (id int );
--通过一个简单的存储过程插入200行,
drop PROCEDURE if EXISTS auto_increment_id;
delimiter //
create PROCEDURE auto_increment_id()
BEGIN
DECLARE i int;
set i=1;
WHILE i<=200 DO
insert INTO assit VALUES(i);
set i=i+1;
end WHILE;
end;
//
CALL auto_increment_id();
然后使用下面sql即可
USE mysql;
SELECT
t1.`name`,
t1.example,
t1.url,
SUBSTRING_INDEX(
substring_index(t1.description, ',', a1.id),
',' ,- 1
)
FROM
help_topic t1
JOIN test.assit a1 ON a1.id BETWEEN 1 --这里通过笛卡尔乘积构造一个循环,
AND (
LENGTH(t1.description) - LENGTH(
REPLACE (t1.description, ',', '')
) + 1
)
ORDER BY
NAME
shell 版的转换会更简单,见链接:https://wenda.zuncuang.com/question/47
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!