Postgres10 Mutation表多字段过滤,新建用户仅展示合并姓名结果
解决方案
核心思路:把变更记录拆分为「Persons表创建操作」和「其他所有变更」两类分别处理再合并,对原有查询逻辑的侵入性最低。
实现步骤
- 把你现有复杂度较高的查询封装为公共CTE(公共表表达式),避免重复编写原有逻辑
- 过滤出非Persons表创建操作的所有记录,原样保留输出
- 单独聚合处理Persons表的创建操作,合并姓名字段生成单行记录,过滤其余40余个多余属性
- 用
UNION ALL合并两部分结果后按需求排序即可
示例代码
WITH original_query AS ( -- 此处粘贴你现有的复杂查询语句,输出字段需包含样例中的所有列:userid、table1、did、execution_date、change_type、attr、value_old、value_new ) -- 第一部分:非Persons表创建操作的所有记录,原样输出 SELECT userid, table1, did, execution_date, change_type, attr, value_old, value_new FROM original_query WHERE NOT (table1 = 'Persons' AND change_type = 'Create') UNION ALL -- 第二部分:单独处理Persons表创建操作,拼接姓名仅保留一行 SELECT userid, table1, did, execution_date, change_type, 'Name' AS attr, NULL AS value_old, -- 请按实际表中的姓名字段名调整CASE判断的attr取值 MAX(CASE WHEN attr = 'first_name' THEN value_new END) || ' ' || MAX(CASE WHEN attr = 'last_name' THEN value_new END) AS value_new FROM original_query WHERE table1 = 'Persons' AND change_type = 'Create' -- 按单次创建操作的公共字段分组,确保每个用户的创建记录仅生成一行 GROUP BY userid, table1, did, execution_date, change_type -- 最终统一排序,可根据实际需求调整排序规则 ORDER BY userid;
注意事项
- 完全兼容PostgreSQL 10版本,不需要依赖高版本语法或额外扩展
- 如果你的表中姓名字段不是
first_name、last_name,自行调整CASE语句里的attr取值即可 - 分组字段可根据业务实际调整,通常
did是单次操作的唯一标识,以此为核心分组即可保证聚合准确性
内容的提问来源于stack exchange,提问作者user2210516
相关产品推荐
相关产品推荐

