本文正在参加「技术专题19期 漫谈数据库技术」活动
在平时的开发中经常会遇到一个用户对应多个部门,所以在存储用户数据的时候在dept_id 字段上存储多个部门id用逗号隔开,如图:
用户表为tb_user_test 部门表为 tb_dept_test 然后需求往往是让你展示用户所在的部门,多个部门用逗号隔开,对于这种需求 则就需要我们的行转列和列转行的函数来解决这类问题,解决sql附上: SELECT tt.user_name, string_agg ( td.NAME, ',' ) FROM ( SELECT user_name, UNNEST ( string_to_array( dept_id, ',' ) ) dept_id FROM tb_user_test ) tt LEFT JOIN tb_dept_test td ON tt.dept_id :: INT = td.ID GROUP BY tt.user_name
查询的结果为:
如图所示就是我们想要的结果,接下来我们来逐步分析上面给出的sql。 第一步 分析from中的sql做了什么:很明显是对dept_id字段先转化成数组 在通过unnest函数把数组转化成列 如图所示:
第二步:左关联部门表查询部门名称
第三步:先通过group by 对用户名称进行分组 然后利用string_agg 函数来进行部门名称的合并 得到最终结果;(string_agg 函数的作用是可以把多个数据通过特殊字段进行合并)。
这类问题在我们进行接口开发的过程中还是经常遇到的问题,希望能对大家有所帮助。
本文正在参加「技术专题19期 漫谈数据库技术」活动