需求

数据库横向数据,页面纵向展示,多结果集合并

源数据结果集- -1

pymysql结果集设置为json pgsql结果集拼接_sql

源数据结果集- -2

pymysql结果集设置为json pgsql结果集拼接_java_02

需要的效果

pymysql结果集设置为json pgsql结果集拼接_pymysql结果集设置为json_03

第一步,将每个结果集进行列转行
关键点(利用pgsql的unnest函数):

语法:unnest(anyarray)
返回值:setof anyelement(可以理解为一个(临时)表)
说明:unnest函数将输入的数组转换成一个表,这个表的每一列都代表相应的一个数组中的元素。
如果unnest与其他字段一起出现在select中,就相当于其他字段进行了一次join。

简单来说,unnest()可以将传入的数组输出为一个表(显示为每一行数据)
这样,我们就可以先将(结果集- -1)中的每一列数据拼接成一个带有特殊字符(如:逗号等)的一列数据,然后利用pgsql的string_to_array()函数将该列切割为一个数组,再传入到unnest()函数中,执行后就是我们想要的结果(列转行)
结果集- -1 处理第一步,合并每列数据为一列

这里我们需要拼接两个字段,因为后面我们要多个结果集合并,需要有一个条件列(如上面两个结果集中,列表头是一致的,当列转行后,我们当做其条件进行多结果集的合并【PS:实际上就是左连接的条件】)

拼接–分割思路:

数据与表头一组,用‘~’隔开【多结果集左连接的关联条件】;

每一列与相邻列,用‘,’合开【列转行的关键分隔】;

格式是:

条件(表头)+“~”+数据+“,”

条件(表头)+“~”+数据+“,”

条件(表头)+“~”+数据+“,”

条件(表头)+“~”+数据+“,”

pymysql结果集设置为json pgsql结果集拼接_数据库_04

结果集- -1 处理第二步,进行列转行

1)进行字符串的切割,将该列转换为数组【利用第一步中的(列转行关键分隔)】

pymysql结果集设置为json pgsql结果集拼接_数据库_05


2)利用unnest()函数进行列–行转换

得到每一行数据格式为:条件+“~”+数据

pymysql结果集设置为json pgsql结果集拼接_sql_06


3)将数据与条件拆分为两列,利用split_part()函数

pymysql结果集设置为json pgsql结果集拼接_数据库_07

结果集- -2 进行上面一样的处理,最后得到:

pymysql结果集设置为json pgsql结果集拼接_java_08

两个结果集进行left join,就得到我们想要的啦,下面是整个sql的截图

pymysql结果集设置为json pgsql结果集拼接_数据库_09

应该还有其他的方案,如果大家有什么更好的处理方案,记得分享呀,( ̄▽ ̄)~*