SQL 里 concat 与 concat_group 区别

 

导读关键词:SQL concat concat_group 区别

问题

SQL里把多个值连接成一个字符串的函数有concat(),concat_ws(),concat_group()

它们有什么区别,分别又适用什么场景呢?

解答

concat_ws(separator, str1, str2,)等价于concat (str1, separator, str2, separator,…),本质上相同,分隔符相同时,可以简略的只写一次。

以下表为例,三个字段f1f2f3

concat适用于行内多个字段连接,如concat(f1,;,f3);而concat_group适用于同一列上多个值的连接,如前三行的f2连接在一起,后两行的f2连接在一起,这就要配合这group by动作来做了:
select f1, concat_group(f2) from t group by f1;

1png

SQL语言这么设计,也是不得已,因为它缺少从表中随意拆出一个数组集合的能力。几个值连接到一起,最基本的写法就是concat(数组)数组.concat(),函数只需要一个concat,剩余的事情就是怎么方便的把这个数组表达出来。

试想这么几个需求:

1、 把整条记录几十个字连接起来;

2、 每两行的奇数行f1和偶数行f2连接起来;

3、 分组之后,把每组的前三名连接起来;


SQL就很难写了,针对这样特殊的需求再增加concat_***()函数也不现实,从表中自由选取数组成新的数组,这需求是无限复杂的。所以SQL只针对两种常用的数组集合给出了函数。而集算器SPL语言设计时,就用统一的模型做了优化。实现起上述需求来就轻车熟路:

2png

三个需求中都用统一的数组.concat()解决连接问题;另外A2中的~代表当前记录;#代表记录在表里的序号,A3~[-1]代表当前计算记录的上一条记录,这样方便跨行引用;A4group函数里能得到分组后的每个“小表”,小表可以做任意复杂的查询计算操作。

所有的这些针对数据计算的创新和改善,最终目的都是为了提高程序员编写计算程序的速度,也更容易写出高性能算法的程序;同样一个需求,三行SPL能做的事,换成SQL就可能需要三十行才能搞定,参见:多步骤复杂 SQL 优化实例

这里有更多针对SQL计算困难的分析文章:

SQL

SPL 语言


快速上手试试:

下载集算器

如何免费使用润乾集算器