【Mysql】根据符号将一行数据拆分成多行

133 阅读1分钟

mysql中支持根据符号 将一行数据分割成多行。

(1)数据初始化

CREATE TABLE example (
	`id` INT (20) DEFAULT NULL,
	`address` VARCHAR (100) DEFAULT NULL,
	`name` VARCHAR (100) DEFAULT NULL,
	`shareholder` VARCHAR (100) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8;

INSERT INTO example VALUES (1, '华盛顿','国会', '小明,小王');
INSERT INTO example VALUES (2, '东京','富士山', '小孙,小苏,小刚');
INSERT INTO example VALUES (3, '上海','外滩', '小风');

(2)查询语句 根据逗号分割

SELECT
    a.id,
    a.address,
    a.name,
    substring_index(
        substring_index(
            a.shareholder,
            ',',
            b.help_topic_id + 1
        ),
        ',' ,- 1
    ) AS shareholder
FROM
    example a
JOIN mysql.help_topic b ON b.help_topic_id < (
    length(a.shareholder) - length(
        REPLACE (a.shareholder, ',', '')
    ) + 1
);

查询结果:

image.png

(3)常见问题 一般测试环境没问题,线上环境数据库会涉及到权限问题。 可能会报如下错误:

### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
SELECT command denied to user 'autochain_uat'@'localhost' for table 'help_topic' ###

问题原因: help_topic是mysql库下的一张表, 使用help_topic时为了解决行转列的问题,出现上面错误是因为用户没有这张表的权限。

解决方法:

可以执行该SQL:GRANT SELECT ON mysql.help_topic TO 'autochain_uat'@'localhost'(给用户赋权限);

取消用户权限SQL:REVOKE SELECT ON mysql.help_topic FROM 'autochain_uat'@'localhost';