数据库中有业务表t1和字典表dictionary

t1表:                                                                     dictionary表:

需求一:将col列拆分成三列

SQL 代码如下所示:

SELECT col,a[1] a1,a[2] a2,a[3] a3
		SELECT regexp_split_to_array( col, ',' ), col FROM t1 
	) AS dt (a)
SELECT
	SPLIT_PART( col, ',', 1 ) a1,
	SPLIT_PART( col, ',', 2 ) a2,
	SPLIT_PART( col, ',', 3 ) a3 
 假设想把 "col" 列分成 "col1" 、 "col2"、 "col3",SQL语句:
1、先添加新的列
ALTER TABLE t1 ADD COLUMN col1 VARCHAR(30);
ALTER TABLE t1 ADD COLUMN col2 VARCHAR(30);
ALTER TABLE t1 ADD COLUMN col3 VARCHAR(30);
2、再用 SPLIT_PART 函数填充新的列
UPDATE t1 
SET col1 = SPLIT_PART( col, ',', 1 ),
col2 = SPLIT_PART( col, ',', 2 ),
col3 = SPLIT_PART( col, ',', 3 );

需求二:列col保存的数据,是字典表dictionary中id值拼接的字符串,想关联出对应 的name值。

SQL 代码如下所示:

SELECT col,
	(SELECT name from dictionary WHERE id=a[1]) a1,
	(SELECT name from dictionary WHERE id=a[2]) a2,
	(SELECT name from dictionary WHERE id=a[3]) a3
		SELECT regexp_split_to_array( col, ',' ), col FROM t1 
	) AS dt (a)

 需求三:列col转化为字典表dictionary中name拼接的字符串

SQL 代码如下所示:

SELECT col,CONCAT_WS(',',a1,a2,a3) as names SELECT col, (SELECT name from dictionary WHERE id=a[1]) a1, (SELECT name from dictionary WHERE id=a[2]) a2, (SELECT name from dictionary WHERE id=a[3]) a3 SELECT regexp_split_to_array( col, ',' ), col FROM t1 ) AS dt (a) ) as temp

我们可能会遇到按分隔符拆成多行或者多列的情况,以及复制的业务需求,只需视情况调整sql语句,或者编写存储过程。

对于列col的值,按分隔符拆分为多列数据时,不知道需要拆分成几列,可以先用以下sql查询出列数。

SELECT max(array_length(regexp_split_to_array(col,','),1))
FROM t1;
select max(case when F1%3=1 then F1 else 0 end) a, max(case when F1%3=2 then F1 else 0 end) b, max(case when F1%3=0 then F1 else 0 end) c from HLR151 group by (F1-1)/3 select c1=a.F1,c2=b.F1,c3=c.F1 from HLR151 a left join HLR151 b on b.F1=a. 概述:my sql .help_topic是 数据库 my sql 的一个表,该表提供查询帮助主题给关键字的详细内容。 说明:一行转多行的这条 sql 语句其实跟help_topic表没 最近在做一个内部系统的报表统计功能,遇到了一个麻烦的查询场景,因为对 sql 语句确实不太熟练,在网上查了一些资料,最终找到了一个解法。具体场景和表结构并不复杂,对 sql 大佬们来说应该也是小case,不过细想确实有趣,特此记录下来。标题起得标题党了,比较少遇到这样的case,解决这个问题过程学到了不少骚操作,感觉挺有意思的。现在的解法并没有考虑性能问题,有更棒的 sql 欢迎分享。另外,表设计很重要,不然后面就会遇到这样的奇葩问题,改表结构的话又是非常难受的工作量。 STUFF 函数将字符串插入到另一个字符串中。它从第一个字符串的开始位置删除指定长度的字符;然后将第二个字符串插入到第一个字符串的开始位置。它只有1和0两个值,在对它进行赋值操作的时候,你应该将它当做数字1和0,但是当你将它绑定到控件时,它显示的却是True和False。字符 数据 的表达式character_expression 可以是常量、变量,也可以是字段或二进制字段。 SQL Server中,没有布尔类型True和False。其实还有一个不错的选择,是Bit类型。取反:使用取模”%”操作来实现。 一、原表status的结构如图所示:展示的主要字段有addtime1(丢失时间)、addtime2(捡到时间)、status(状态)1,表示 功;2 表示认领中;0表示未认领;二、现在报表设计的需求是统计一个月之内 功认领的个数、两个月之内 功认领的个数、三个月之内 功认领以及长时间未认领的个数;三、实现的 SQL 语句如下:这个实例是相当于将两个事件的差值作为 一列 ,将该列 拆分 多列 ,同时使用case... 通过dual表生 10条 数据 对AA表进行关联,把 数据 扩展 按照逗号分隔后的长度,接下来处理逗号分隔后的 数据 ,使用regexp_substr函数进行 数据 分隔。modifier:模式(‘i’不区分大小写进行检索;默认为’c’)针对的是正则表达式里字符大小写的匹配。position:起始位置,从字符串的第几个字符开始正则表达式匹配(默认为1) 注意:字符串最初的位置是1而不是0。occurrence:获取第几个分割出来的组(分割后最初的字符串会按分割的顺序排列 组)pattern:进行匹配的正则表达式。 核心函数:explode(数组类型) 搭配:一般和split('a,b',',')结合使用,因为我们 数据库 中一般保存的是String类型,需要转化为数组类型 SELECT explode(split('外语,数学,语文',',')); 但是 explode 有一个缺点,他只能包含 explode 的字段 SELECT explode(split(学科,',')),name FROM t_demo; 本篇分享一道我以前面试遇到的 数据 处理题,其中有一个步骤是要将原始 数据 一列 进行分列,并且按照分列后的情况进行行拓展,如以下类似 数据 :需要根据符号";"对score进行分列,最终结果需要为(长度原因,截图为效果图):本文会在Excel、Python和 SQL 三个工具中,用不同的处理方式对 数据 处理,实现分列到行。1 Excel-分列&Power Query思路是将score列进行普通分列,然后... 这张图只要看我划红线的两列就可以了,RoomID(会议室ID) 、AttendPerson(参会人员ID,多个以逗号分隔); 我遇到的问题是,根据用户ID查询某个用户,所有参会的记录,直接用LIKE是不行的,所以就用了以下方法如下: if exists (select * from tempdb.dbo.sysobjects where id = ob... id, start_time, end_time, pay_amount, months,这是一条 数据 ,现在需要根据规则,把这条 数据 拆分 多条 数据 ,也就是平均到每个月上面。如果写 sql 该如何实现呢?如果不引入其他编程语言,只是用 sql 实现要怎么做?例如这里根据12/3 再生 4条 数据 要如何实现?假如可以引入编程语言这个要怎么实现?今日遇到一个分摊场景,例如。 数据 开发中的 数据 质量校验。稍微复杂一点的情况是。