MySQL逗号分割字段的列转行

前言:

由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值(具体结构见下表)。

这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果。

表数据:

ID  Value
1 tiny,small,big
2 small,medium
3 tiny,big

期望得到结果:

ID Value
1 tiny
1 small
1 big
2 small
2 medium
3 tiny
3 big

总结:

这种方法的缺点在于,我们需要一个拥有连续数列的独立表(这里是incre_table)。并且连续数列的最大值一定要大于符合分割的值的个数。

例如有一行的mSize 有100个逗号分割的值,那么我们的incre_table 就需要有至少100个连续行。

当然,mysql内部也有现成的连续数列表可用。如mysql.help_topic: help_topic_id 共有504个数值,一般能满足于大部分需求了。

改写后如下:

#需要处理的表
create table tbl_name (ID int ,mSize varchar(100));
insert into tbl_name values (1,‘tiny,small,big‘);
insert into tbl_name values (2,‘small,medium‘);
insert into tbl_name values (3,‘tiny,big‘);

#SQL
select a.ID,substring_index(substring_index(a.mSize,‘,‘,b.help_topic_id+1),‘,‘,-1)
from
tbl_name a
join
mysql.help_topic b
on b.help_topic_id < (length(a.mSize) - length(replace(a.mSize,‘,‘,‘‘))+1)
order by a.ID;

时间: 2024-11-07 14:05:11

MySQL逗号分割字段的列转行的相关文章

MySQL逗号分割字段的行列转换测试改进

 <p>由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表).</p><p>这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果.</p> <span class="cnblogs_code_copy"></span><p style="margin: 10px auto; line-height: 19px;

【mysql】逗号分割字段的行列转换

由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式,即同一个列中存储了多个属性值.这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果: 建表语句: 1 DROP table if EXISTS tbl_name; 2 CREATE TABLE tbl_name( 3 id int(11) not null auto_increment, 4 userName varchar(100) not null, 5 PRIMARY KEY(id) 6 ) 7 EN

Mysql数据处理/行转列/列转行/分割/拼接/数据复制汇总

mysql数据处理记录(使用的 Workbench) 生成随机数 逗号或分号拼接的字符串分割成多行 多行数据转化成用逗号拼接的字符串 将A表的数据添加到B表 一.生成随机数 生成18位:(19位就加颗0 / 17位就减0) SELECT FLOOR(+ RAND() * 10000000000000000000) 二.将字符串分割(行转列) select a.ID,substring_index(substring_index(a.B,',',b.help_topic_id+1),',',-1)

Java不规则字符串按照逗号分割的解析方法(字段中又含有逗号)

/** * Java字符串逗号分割解析方法 * 本专门针对双引号中还有逗号或者某个字段无双引号的情况而设计的 * 例如要将 字符串 String sss="101,\"a\",\"中国,江苏\",\"b\",\"中国,北京\",1,0,\"c\""按照逗号进行分割解析; * 正确的split的结果是 (101)(a)( 中国,江苏) ( b)( 中国,北京) ( 1)( 0)( c) *

MYSQL开发技巧之行转列和列转行

行转列--两种方法第一种方法:行转列我们通常是使用交叉连接和子查询的方式做到,比如下面的例子,查询每个name的对应id的和mysql> select * from user; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | | 5 | a | | 6 | a | | 7 | c | | 8 | d | +----+------+ 我们用分组查询能得到每个name的id的和,但是是

sql server字段是逗号分割的id,关联明细表查询

有时候一张表的一个字段是以逗号分割的一个字符串,分割的数字是明细表的主键id. 关联明细表查询可以这样做: declare @str as nvarchar(1000) declare @areanos as nvarchar(200) --这是把areanos字段赋值给@areanos变量 set @areanos='1,2,3' --将拼接的SQL脚本赋值给变量 set @str='select * from area where areano in ('+@areanos+') order

逗号分割符--字段中含逗号等情况的解析方法Java实现

最近在处理文本字符串时,没一行数据都是按照逗号分割的,每个字段值一般情况是带有双引号的,但是有的字段值里面还包含逗号,甚至有的字段就没有双引号,这个分割起来就有点麻烦了 下面说一下我解决方法,如果谁有更好的方法,欢迎加入讨论O(∩_∩)O~ /** * Java字符串逗号分割解析方法 * 本专门针对双引号中还有逗号或者某个字段无双引号的情况而设计的 * 例如要将字符串String sss="101,\"a\",\"中国,江苏\",\"b\&quo

MySQL 字符串 分割 多列

mysql如何进行以,分割的字符串的拆分 - 我有一个梦想 - CSDN博客https://blog.csdn.net/u012009613/article/details/52770567 mysql字符串分割函数(行转列) - 小草青青 - 博客园https://www.cnblogs.com/jiangwenju/p/4886066.html mysql中根据某个字符为间隔进行分列(有举例)_百度知道https://zhidao.baidu.com/question/284013200.h

Mysql中行转列和列转行

一.行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score(    id INT(11) NOT NULL auto_increment,    userid VARCHAR(20) NOT NULL COMMENT '用户id',    subject VARCHAR(20) COMMENT '科目',    score DOUBLE COMMENT '成绩',