SQLite 聚合函数中的 group_concat()

前端之家收集整理的这篇文章主要介绍了SQLite 聚合函数中的 group_concat()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

先上定义 group_concat(x[,y])

函数返回一个字符串,该字符串将会连接所有非NULL的x值。该函数的y参数将作为每个x值之间的分隔符,如果在调用时忽略该参数,在连接时将使用缺省分隔符”,”。再有就是各个字符串之间的连接顺序是不确定的。

找到这个函数不容易呀,我本身对sql语句懂的就不多,只会增删改查。

需求是

DepID StaffName

101 AAAaa
101 BBBb
101 CCCccc
202 DDDddd
202 EEE
202 FFF
303 GGGGG

表说明,DepID为部门ID,StaffName为员工姓名,一个部门当然会有0..N多个员工

sql语句将上面的表变成下面组合起来的方式。

DepID StaffNames

101 AAAaa;BBBb;CCCccc
202 DDDddd;EEE;FFF
303 GGGGG

大概就是上面的意思吧。

首先想到的是合并记录,百度后,发现这个需求叫聚合,后查询sqlite聚合函数,才找到group_concat()

group_concat()函数要和group by语句同时使用才能产生效果

select DepID,group_concat(StaffNames) from tablename group by DepID

—————————————————————————————————————————

MysqL函数IF,GROUP_CONCAT的使用

MysqL中最近用到的函数,记录下 www.2cto.com
1、IF(expr1,expr2,expr3)与我们常用的三目运算类似。expr1是一个表达式,如果TRUE,返回expr2否则为expr3
如下数据:
sql代码
INSERT INTO a(id,a,b) VALUES (‘1’,‘1’,‘1’);
INSERT INTO a(id,b) VALUES (‘2’,‘0’);
INSERT INTO a(id,b) VALUES (‘3’,b) VALUES (‘4’,b) VALUES (‘5’,‘0’,b) VALUES (‘6’,‘1’);
比如要查询a的返回状态,1代表是,0代表否有:
sql代码
SELECT IF(a=1,’是’,’否’) as flag FROM a
有时需要比较两列数据,如同时比较a、b其取值通过(1,1),(1,0),(0,0)来统计
Java代码
SELECT
SUM(IF (a=1 AND b= 1,1,0)) as flag1,
SUM(IF (a=1 AND b= 0,0)) as flag2,
SUM(IF (a=0 AND b= 1,0)) as flag3,
SUM(IF (a=0 AND b= 0,0)) as flag4
FROM a
Java代码
1 3 1 1
这样就完成了按照类型来统计

2、GROUP_CONCAT将一组数据中的non-NULL作为串联的字符串返回,常与group在一起使用。简单的说就是行转列,如下数据:
sql代码
INSERT INTO table2(id,a) VALUES (‘1’,‘0’);
INSERT INTO table2(id,‘1’);
INSERT INTO table2(id,a) VALUES (‘2’,‘3’);
INSERT INTO table2(id,‘4’);
这里需要返回
sql代码

id a

1 |0,4
2 |0,3
那么我们可以通过该函数获取
sql代码
SELECT id,GROUP_CONCAT(a)
FROM table2
GROUP BY id;
来看看GROUP_CONCAT语法:
sql代码
GROUP_CONCAT([DISTINCT] expr [,expr …]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name …]]
[SEPARATOR str_val])
参考该函数的doc :可以DISTINCT去重, ORDER BY排序,SEPARATOR 来指定分隔符(默认为“,”)如有下面数据
Java代码
INSERT INTO table2(id,‘4’);
INSERT INTO table2(id,‘3’);
我们需要显示出来的按照a降序、不能重复:
sql代码
SELECT id,GROUP_CONCAT(DISTINCT a ORDER BY a DESC SEPARATOR ‘-‘)
FROM table2
GROUP BY id;
www.2cto.com
这样输出结果:
sql代码

id a

1 4-1-0
2 3-0
有了这个函数我们就可以处理一些业务上的事情了,比如现在有两张表其中一张table3的id一对多与另一张表table4的rid关联,现在要统计ipad和mac的具体版本,那么我们就可以直接用sql实现了
Java代码
– table3(id,name)
INSERT INTO table3(id,name) VALUES (‘1’,‘ipad’);
INSERT INTO table3(id,name) VALUES (‘2’,‘mac’);

– table4(id,rid,name)
INSERT INTO table4(id,‘ipad1’);
INSERT INTO table4(id,‘ipad2’);
INSERT INTO table4(id,name) VALUES (‘3’,‘ipad3’);
INSERT INTO table4(id,name) VALUES (‘4’,‘2’,‘pro’);
INSERT INTO table4(id,name) VALUES (‘5’,‘air’);
INSERT INTO table4(id,name) VALUES (‘6’,‘mini’);
sql代码
SELECT
a.id,
a.name,
GROUP_CONCAT(b.name) as version
FROM table3 a JOIN table4 b ON a.id = b.rid
GROUP BY a.id;


id name version
1 ipad ipad1,ipad2,ipad3
2 mac pro,air,mini

注意事项: 1、连接的长度受group_concat_max_len参数限制,也就是说这个返回这个长度不是所有都会返回,但是默认为1024也很长了,当然具体可能会到当前concat字段的类型限制同时和max_allowed_packet的限制 2、连接返回二进制和非二进制string,依赖当前连接的类型。有可能超过512个后就返回TEXT或BLOB。如果连接的是int或其他最好先转成Char,如使用函数CAST(expr AS type),CONVERT(expr,type),见CAST文档 Java代码 – CAST SELECT CAST(id as CHAR) FROM table4; – Convert SELECT Convert(id,CHAR) FROM table4;

猜你在找的Sqlite相关文章