mysql根据逗号将一行数据拆分成多行数据

  • 原始数据
  • 处理结果展示
  • DDL
    CREATE TABLE `company` (
    `id` int(20) DEFAULT NULL,
    `name` varchar(100) DEFAULT NULL,
    `shareholder` varchar(100) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • DML
    INSERT INTO `company` VALUES ('', '阿里巴巴', '马云');
    INSERT INTO `company` VALUES ('', '淘宝', '马云,孙正义');
  • 三种方式,相同的原理
  1. 使用MySQL库中的自增序列表

    SELECT
    a.id,
    a. NAME,
    substring_index(
    substring_index(
    a.shareholder,
    ',',
    b.help_topic_id + 1
    ),
    ',' ,- 1
    ) AS shareholder
    FROM
    company a
    JOIN mysql.help_topic b ON b.help_topic_id < (
    length(a.shareholder) - length(
    REPLACE (a.shareholder, ',', '')
    ) + 1
    )
  2. 自建自增序列表
    CREATE TABLE `addself` (
    `id` int(20) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    INSERT INTO `addself` VALUES ('');
    INSERT INTO `addself` VALUES ('');
    INSERT INTO `addself` VALUES ('');
    INSERT INTO `addself` VALUES ('');
    INSERT INTO `addself` VALUES ('');
    SELECT
    a.id,
    a.NAME,
    substring_index(
    substring_index(
    a.shareholder,
    ',',
    b.id+ 1
    ),
    ',' ,- 1
    ) AS shareholder
    FROM
    company a
    JOIN addself b ON b.id< (
    length(a.shareholder) - length(
    REPLACE (a.shareholder, ',', '')
    ) + 1
    )
  3. 以数据库里已有表,构建自增序列表
    select a.ID,a.name,substring_index(substring_index(a.shareholder,',',b.id+1),',',-1) shareholder
    from
    company a
    join
    (SELECT (@ROW :=@Row + 1) as id FROM xh,(SELECT @Row:=-1) zz) b
    on b.id < (length(a.shareholder) - length(replace(a.shareholder,',',''))+1);

    xh表是库里已有表(可以不是序列表),行数必须大于分割字段的最大逗号数

  • 小结
  1. 序列表必须从0开始,行数与最长逗号有关,行数至少比最长逗号个数加1,可以建0~1000。
  2. 为什么不用MySQL自带的自增序列表mysql.help_topic?因为好多公司的数据库是没有权限操作这些表的, 不能使用。

mysql根据逗号将一行数据拆分成多行数据的更多相关文章

  1. Oracle数据库字段数据拆分成多行(REGEXP_SUBSTR函数)

    做多选功能时为了简便,会在某个字段中存储多个值,保存时虽然省事,但后续的查询统计时还需要拆分数据才行,因此这时需要将字段内的值分成多行以便后续使用. 下面这个例子实现了字段内数据的拆分: --创建测试 ...

  2. mysql-一行分隔成多行数据

    mysql将某个字段有分隔符号分隔成多行数据 SELECT a.id, a. NAME, substring_index( substring_index( a.name, ',', b.help_t ...

  3. mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

    转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的 ...

  4. MYSQL: sql中某一个字段内容为用逗号分割的字符串转换成多条数据

    场景: 表名:testsuer id     name 1       小红,小李,李红,小法 要结果值为: 1     小红 1     小李 1     李红 1     小法 MYSQL函数解释 ...

  5. XML转换成TXT行数据的Java程序

    ZKe ------------------- XML数据的一个块内的所有属性,转换成TXT文件的一行.众所周知XML文件是通过类似HTML的标签进行数据的定义如图所示 属性由id, article, ...

  6. notepadd++中,如何根据某个字符将一行内容切割成多行?

    背景描述: 今天在做个事情,遇到下面字符,就想将每个词,如cluster,zookeeper都单独的一行 [cluster, activemq, controller, brokers, zookee ...

  7. Oracle如何以逗号分隔的字符串拆分为多行数据

    近期在工作中遇到某表某字段是可扩展数据内容,信息以逗号分隔生成的,现需求要根据此字段数据在其它表查询相关的内容展现出来,第一想法是切割数据,以逗号作为切割符,以下为总结的实现方法,以供大家参考.指教. ...

  8. oracle单字段拆分成多行

    已上图为例 先以逗号分隔拆分 拆分函数: CREATE OR REPLACE FUNCTION SPLIT(P_STRING VARCHAR2, P_SEP VARCHAR2 := ',') RETU ...

  9. Sql将一列数据拆分为多行显示的两种方法

    原始数据与期望结果有表tb, 如下:id          value----------- -----------1           aa,bb2           aaa,bbb,ccc欲按 ...

随机推荐

  1. Pygame安装问题

    1.首先使用如下命令: conda install -c https://conda.anaconda.org/quasiben pygame 测试报错: >>> import py ...

  2. redux、react-redux、redux-thunk、redux-saga使用及dva对比

    一.redux使用 Redux的核心概念其实很简单:将需要修改的state都存入到store里,发起一个action用来描述发生了什么,用reducers描述action如何改变state tree ...

  3. Ajax提交打开新窗口,浏览器拦截处理;以及跨域问题

    //主要是添加同步处理 $.ajax({ url: "ashx/OrderHander.ashx?action=CheckRepeat", data: { "OrderI ...

  4. 软件测试必须掌握的linux命令大全

    测试工程师的四大基础技能:数据库.linux.网络协议.测试工具,不管是刚入门还是已经工作多年,这几个方向都是要掌握的.今天我们再讲一下测试工程师必须要掌握的linux命令. 测试工程师需要掌握lin ...

  5. 从7点到9点写的小程序(用了模块导入,python终端颜色显示,用了点局部和全局可变和不可变作用域,模块全是自定义)

    未完待续的小程序 要是能做的好看为啥不做的好看 在同目录下生成程序 1.程序文件 run.py from login import login from register import registe ...

  6. [PTA] 数据结构与算法题目集 6-2 顺序表操作集

    //创建并返回一个空的线性表: List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; ...

  7. [leetcode] 5. Longest Palindromic Substring (Medium)

    原题链接 找到并返回最长回路子串 思路: 解法一: 最简单的双重遍历,判断s[i]到s[j]是不是回串. Runtime: 610 ms, faster than 6.39% of Java 慢的不行 ...

  8. kubernetes的volume的权限设置(属主和属组)

    apiVersion: v1kind: Podmetadata: name: hello-worldspec:  containers:  # specification of the pod's c ...

  9. 开源分布式事务中间件Seata使用指南

    介绍 Seata 是阿里巴巴开源的分布式事务中间件,一种分布式事务解决方案,具有高性能和易于使用的微服务架构. 初衷 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入 高性能 ...

  10. CMD开放3389端口

    REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t R ...