PostgreSQL 12.8 行转列需求:将变量名转为列头并整合多类型字段值
PostgreSQL 12.8 行转列需求:将变量名转为列头并整合多类型字段值
Hi Victor,我来帮你搞定这个Camunda变量表的行转列问题~
你之前的尝试思路其实方向是对的,但差了关键一步聚合——因为你的表中每个流程实例的每个变量都是单独一行,直接用CASE WHEN会生成多行为null的记录,需要通过聚合函数把同一实例的变量值合并到同一行里。
针对你的需求的解决方案
这里用MAX()聚合函数配合CASE WHEN,就能把同一proc_inst_id_下的不同变量值整合到一行,同时对应到正确的列:
SELECT v.proc_inst_id_ AS id_, -- 针对offShoreOnly变量,取long_字段的值 MAX(CASE WHEN v.name_ = 'offShoreOnly' THEN v.long_ END) AS "offshoreOnly", -- 针对dueDate变量,取long_字段的值 MAX(CASE WHEN v.name_ = 'dueDate' THEN v.long_ END) AS "dueDate" FROM camunda_data.act_ru_variable v WHERE v.proc_def_id_ NOT ILIKE 'StartProcess%' AND v.name_ IN ('dueDate', 'offShoreOnly') GROUP BY v.proc_inst_id_;
为什么这样能行?
CASE WHEN会为每个变量筛选出对应字段的值,其他行则返回nullMAX()函数会自动忽略null值,只保留每个proc_inst_id_下该变量的有效数值GROUP BY proc_inst_id_确保最终结果中每个流程实例只占一行
扩展支持多类型变量
如果还有其他类型的变量(比如appealDto存在text_字段里),只需要扩展CASE WHEN的分支即可:
SELECT v.proc_inst_id_ AS id_, MAX(CASE WHEN v.name_ = 'offShoreOnly' THEN v.long_ END) AS "offshoreOnly", MAX(CASE WHEN v.name_ = 'dueDate' THEN v.long_ END) AS "dueDate", -- 针对text类型的变量,取text_字段的值 MAX(CASE WHEN v.name_ = 'appealDto' THEN v.text_ END) AS "appealDto" FROM camunda_data.act_ru_variable v WHERE v.proc_def_id_ NOT ILIKE 'StartProcess%' AND v.name_ IN ('dueDate', 'offShoreOnly', 'appealDto') GROUP BY v.proc_inst_id_;
额外小技巧
如果需要把所有值统一转成文本类型方便展示,可以在CASE WHEN里加类型转换:
MAX(CASE WHEN v.name_ = 'offShoreOnly' THEN v.long_::TEXT END) AS "offshoreOnly"
备注:内容来源于stack exchange,提问作者VictorGram
相关产品推荐
相关产品推荐

