【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 ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 8
 9 insert into tbl_name values (1,‘a,aa,aaa‘);
10 insert into tbl_name values (2,‘b,bb‘);
11 insert into tbl_name values (3,‘c,cc‘);

如下图:

sql语句:

1 SELECT a.id,SUBSTRING_INDEX(SUBSTRING_INDEX(a.userName,‘,‘,b.help_topic_id+1),‘,‘,-1) as name
2 from tbl_name a left join mysql.help_topic b
3 on b.help_topic_id < (LENGTH(a.userName)-LENGTH(REPLACE(a.userName,‘,‘,‘‘))+1)
4 ORDER BY a.id;

执行结果:

分析如下:

LENGTH(a.userName)-LENGTH(REPLACE(a.userName,‘,‘,‘‘))+1

表示了按逗号分割后,获得行转成列的数量,以下简称n;

根据id进行循环

{
  判断:i 是否 <= n
    {
      获取最靠近第 i 个逗号之前的数据, 即 SUBSTRING_INDEX(SUBSTRING_INDEX(a.userName,‘,‘,b.help_topic_id+1),‘,‘,-1)
      i = i +1
    }
  id = id +1
}

总结:

这种方法的缺点在于,我们需要一个拥有连续数列的独立表(这里是incre_table)。并且连续数列的最大值一定要大于符合分割的值的个数。当然,mysql内部也有现成的连续数列表可用。如mysql.help_topic: help_topic_id 共有504个数值,一般能满足于大部分需求了。

原文地址:https://www.cnblogs.com/hongzm/p/8145149.html

时间: 2024-11-04 00:27:41

【mysql】逗号分割字段的行列转换的相关文章

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

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

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 总结: 这种方法的缺点在于,我们需要一个拥有连

Mysql实现行列转换

前言: 最近又玩起了sql语句,想着想着便给自己出了一道题目:“行列转换”.起初瞎折腾了不少时间也上网参考了一些博文,不过大多数是采用oracle数据库当中的一些便捷函数进行处理,比如”pivot”.那么,在Mysql环境下如何处理? 自己举了个小例子: sql代码实现: 1 -- Step1:建表并插入数据 2 3 -- Step2:中间转换,即“二维转一维”得到一维表. 4 5 -- Step3:利用IF判断并“group by”即可得到目标结果表. 6 7 8 9 -- 加载 10 11

Java将一段逗号分割的字符串转换成一个数组

String 类:String 类代表字符串.Java 程序中的所有字符串字面值都作为此类的实例实现.字符串是常量,它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因为 String 对象是不可变的,所以 可以共享.String 类包括的方法可用于检查序列的单个字符.比较字符串.搜索字符串.提取子字符串.创建字符串副本并将所有字符全部转换为大写或小写.Java 语言提供对字符串串联符号("+")以及将其他 对象转换为字符串的特殊支持.字符串串联是通过 StringBuilde

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

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

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

oracle split去逗号,行列转换

转载 1.针对  '1','2','3','4','5'(逗号在字符串外面) SQL> SELECT COLUMN_VALUE  FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5')); COLUMN_VALUE -------------------------------------------------------------------------------- 1 2 3 4 5 2.针对'1,2,3,4,5'(逗号在字符串里面)

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

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

oracle行列转换函数的使用

racle 10g wmsys.wm_concat行列转换函数的使用: 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行,接下来上例子,看看这个神奇的函数如何应用 1.把结果按分组用逗号分割,以一行打印出来.(如果需要换其它的可以用replace函数:replace(wm_concat(name),',','|')) select t.u_id, wmsys.wm_concat(t.goods), wmsys.wm_concat