我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【SQL】按特定字符分割一行转多行

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【SQL】按特定字符分割一行转多行

原表如下:

with t1 as(    select 1 as id, "a,b" as course    union    select 2 as id, "a,b,c" as course    union    select 3 as id, null as course    union    select 4 as id, "c" as course)select * from t1;
idcourse
1a,b
2a,b,c
3NULL
4c

需要将 course 按照 ‘,‘ 拆分成下表:

idcourse
1a
1b
2a
2b
2c
3NULL
4c

方法如下:

with t1 as(    select 1 as id, "a,b" as course    union    select 2 as id, "a,b,c" as course    union    select 3 as id, null as course    union    select 4 as id, "c" as course)select    t1.id,    substring_index(substring_index(t1.course, ',', b.help_topic_id + 1), ',', -1) as coursefrom t1 join mysql.help_topic bon b.help_topic_id < (length(t1.course) - length(replace(t1.course, ',', '')) + 1)union allselect id, coursefrom t1where course is null

这里主要用到 substring_index 和 mysql.help_topic。

substring_index

SUBSTRING_INDEX 是字符串截取函数。

SUBSTRING_INDEX(str, delim, count)
  • str : 表示需要拆分的字符串
  • delim : 表示分隔符,通过某字符进行拆分
  • count : 当 count 为正数,取第 n 个分隔符之前的所有字符;当 count 为负数,取倒数第 n 个分隔符之后的所有字符。

例如:

SELECT SUBSTRING_INDEX('a*b*c*d', '*', 1);  -- 返回: aSELECT SUBSTRING_INDEX('a*b*c*d', '*', 2);  -- 返回: a*b SELECT SUBSTRING_INDEX('a*b*c*d', '*', 3);  -- 返回: a*b*cSELECT SUBSTRING_INDEX('a*b*c*d', '*', 4);  -- 返回: a*b*c*dSELECT SUBSTRING_INDEX('a*b*c*d', '*', -1); -- 返回: dSELECT SUBSTRING_INDEX('a*b*c*d', '*', -2); -- 返回: c*dSELECT SUBSTRING_INDEX('a*b*c*d', '*', -3); -- 返回: b*c*dSELECT SUBSTRING_INDEX('a*b*c*d', '*', -4); -- 返回: a*b*c*d
mysql.help_topic

help_topic 本身是 MySQL 一个帮助解释注释表,用于解释 MySQL 各种专有名词,由于这张表数据 ID 是从 0 顺序增加的,方便我们用于计数,但是 8.0.17 版本的只有 686 条数据,超过这个数字,我们就需要己自定义一张表。

可以用做计数的临时表,查询的语句只会用 help_topic 计数,超出的部分其实都是脏数据。

  • help_topic_id:帮助主题详细信息在表记录中对应的 ID;
  • name:帮助主题给定的关键字名称,与 help_keyword 表中的 name 字段值相等;
  • help_category_id:帮助主题类别 ID,与 help_category 表中的 help_category_id 字段值相等;
  • description:帮助主题的详细信息(这里就是我们通常查询帮助信息真正想看的内容,例如:告诉我们某某语句如何使用的语法与注意事项等);
  • example:帮助主题的示例信息(这里告诉我们某某语句如何使用的示例);
  • url:该帮助主题对应在 MySQL 官方在线手册中的URL链接地址。

如果不需要展开成多行,只需要计数,则可以将 ‘,‘ 替换成空,计算字符串的长度差。

selectid, length(course) - length(replace(course, ',', '')) + 1 as cntfrom t1

结果如下:

idcnt
12
23
3NULL
41

来源地址:https://blog.csdn.net/weixin_45545090/article/details/127109668

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【SQL】按特定字符分割一行转多行

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【SQL】按特定字符分割一行转多行

原表如下: with t1 as( select 1 as id, "a,b" as course union select 2 as id, "a,b,c" as course union select 3
2023-08-19

SQL 根据特定分隔符分割字符串

create function [dbo].[GetSplitStr]( @str nvarchar(500),  --要分割的字符串 @split nvarchar(50),  --分隔符号 @index int --取第几个元素)returns nvarc

	SQL 根据特定分隔符分割字符串
2021-01-09

sql拆分字符串实现一行变多行的实例代码

目录一、需求一、pg数据库中一行变多行二、mysql数据库中一行变多行2.1 实现方式2.2 递归方式2.3 方式二 一、需求1 某一个字段中的数据为字符串拼接,要求按照特定分隔符分割成多行2 例如(movies)表拆分结果编程网为
sql拆分字符串实现一行变多行的实例代码
2024-09-07

Shell命令行中特殊字符与其转义的示例分析

这篇文章将为大家详细讲解有关Shell命令行中特殊字符与其转义的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。特殊符号及其转义大家都知道在一个shell命令是由命令名和它的参数组成的, 比如 ca
2023-06-09

MYSQL: sql中某一个字段内容为用逗号分割的字符串转换成多条数据(适用于部分树机构)

1.创建表的示例 CREATE TABLE tbl_name( id int(11) not null auto_increment, userName varchar(100) not null,
2023-08-17

利用FOR XML PATH行转列(根据某字段分组,多行数据转成一行,并用逗号隔开)

CREATE TABLE #TEST(A VARCHAR(10) NULL,B VARCHAR(MAX) NULL)INSERT INTO #TESTSELECT "A","A001"UNION ALLSELECT "A","A002"UNION ALLSEL
利用FOR XML PATH行转列(根据某字段分组,多行数据转成一行,并用逗号隔开)
2018-05-13

编程热搜

目录