数据库中有业务表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条
数据
要如何实现?假如可以引入编程语言这个要怎么实现?今日遇到一个分摊场景,例如。
数据
开发中的
数据
质量校验。稍微复杂一点的情况是。